Sql 获取最后插入行的ID,并使用它插入存储过程中的另一个表

Sql 获取最后插入行的ID,并使用它插入存储过程中的另一个表,sql,plsql,oracle10g,Sql,Plsql,Oracle10g,我使用以下存储过程将数据插入表中: 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);
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:坏绑定变量“V_ID”我想我需要在某个地方声明V_ID,但我在BEGIN语句前后都尝试了,但这又产生了另一个错误

有什么办法吗


谢谢

将您的程序更改为

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;

分享和享受。

将您的程序更改为

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;

共享和享受。

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