【问题标题】:how to generate primary key values while inserting data into table through pl/sql stored procedure通过pl/sql存储过程向表中插入数据时如何生成主键值
【发布时间】:2010-04-10 15:38:38
【问题描述】:

我需要通过 pl/sql 存储过程将数据插入到特定的表中。我的要求是:

  • 在插入时应为特定列生成 PRIMARY KEY 值;
  • 它应该将该 PRIMARY KEY 值返回给输出变量;和
  • 对于另一列,它应该验证我的字符串,使其只包含字符,而不是整数。

【问题讨论】:

    标签: sql plsql oracle10g


    【解决方案1】:

    您可以使用 Oracle SEQUENCE 生成主键值作为代理键。您可以在使用TRANSLATE 的列上创建一个约束来检查新插入/更新的数据中是否不存在数字。

    一些示例代码,适用于 SQL*Plus:

    CREATE SEQUENCE mysequence;
    /
    
    CREATE TABLE mytable (
       pkidcol NUMBER PRIMARY KEY,
       stringcol VARCHAR2(100)
    );
    /
    
    ALTER TABLE mytable ADD (
       CONSTRAINT stringnonnumeric
       CHECK (stringcol = TRANSLATE(stringcol,'A0123456789','A'))
    );
    /
    
    DECLARE
       mystring mytable.stringcol%TYPE := 'Hello World';
       myid     mytable.pkidcol%TYPE;
    BEGIN    
       INSERT INTO mytable (pkidcol, stringcol)
       VALUES (mysequence.NEXTVAL, mystring)
       RETURNING pkidcol INTO myid;
    END;
    /
    

    【讨论】:

    • @Jeffrey,给 +1。但是,您可能应该稍微修改一下您的答案,翻译不会告诉他该字段是否只有字符,它只是翻译它。但是,如果您将其更改为 REGEXP_INSTR 并确保它为任何数字字符返回零,我认为这将是一个更可靠的答案。
    • 感谢 Nick,但这里 TRANSLATE 的唯一目的是实现检查约束。它不翻译任何东西 - 它只是说“如果这里有任何数字,则不允许插入/更新”。如果他希望插入/更新成功,他将不得不在应用程序代码中实现TRANSLATE,或者添加一个触发器来修改它(但我不建议这样做)。
    【解决方案2】:

    在 oracle 中,我认为“身份”列最好通过一个序列和一个插入触发器来实现,该触发器检查主键列是否为空,如果是,则获取下一个序列并插入它。

    然后可以使用“returning”子句获取新创建的主键:

    insert into <table> (<columns>) values (<values>) returning <prim_key> into <variable>;
    

    在进入数据库之前,我会在代码中亲自处理字符串字段的过滤(如果可能的话)。众所周知,数据库在处理字符串操作方面效率低下。

    【讨论】:

    • Oracle 非常非常快地处理任何 pl/sql 操作,尤其是如果您允许在 10g 及更高版本中进行本机编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2013-11-13
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多