【问题标题】:Get ID of last inserted row and use it to insert into another table in a stored procedure获取最后插入行的 ID 并使用它插入存储过程中的另一个表
【发布时间】:2013-07-31 21:06:38
【问题描述】:

我有以下存储过程,用于将数据插入表中:

CREATE OR REPLACE PROCEDURE mySproc
(
 invoiceId IN NUMBER
 customerId IN NUMBER
)
IS
BEGIN 
    INSERT INTO myTable (INVOICE_ID) 
    VALUES (invoiceId);
END mySproc;
/

我想要做的是获取最后插入的 ID(这是 myTable 上的主键字段,并使用序列自动递增)并将其插入另一个表,我尝试了以下但无法使其工作:

CREATE OR REPLACE PROCEDURE mySproc
(
 invoiceId IN NUMBER
 customerId IN NUMBER
)
IS
BEGIN 
    INSERT INTO myTable (INVOICE_ID) 
    VALUES (invoiceId)

    returning id into v_id;

    INSERT INTO anotherTable (ID, customerID) 
    VALUES (v_id, customerId);  
END mySproc;
/

我收到此错误:[Error] PLS-00049 (59: 26): PLS-00049: bad bind variable 'V_ID' 我想我需要在某处声明 v_id 但我之前尝试过并在 BEGIN 语句之后,但这又给出了另一个错误。

关于如何做到这一点的任何想法?

谢谢

【问题讨论】:

  • 除非你有竞争条件,否则为什么不从序列中获取最后一个 Id。如果我没记错的话,Sequence.CURRVAL。要么获取表中最大的 ID(自动递增,所以最大 = 插入的最后一个 ID)。
  • @Sam:currval 始终是安全的,不会受到竞争条件的影响——它返回的值与 nextval 在该会话中最近返回的值相同。

标签: sql plsql oracle10g


【解决方案1】:

将您的程序更改为

CREATE OR REPLACE PROCEDURE mySproc
(
 invoiceId IN NUMBER,  -- Added comma
 customerId IN NUMBER
)
IS
    v_id  NUMBER;  -- ADDED
BEGIN 
    INSERT INTO myTable (INVOICE_ID) 
    VALUES (invoiceId)
    returning id into v_id;

    INSERT INTO anotherTable (ID, customerID) 
    VALUES (v_id, customerId);  
END mySproc;

分享和享受。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多