2013-07-31 44 views
0

我有以下我们用它来的数据插入表中的存储过程:获取最后插入的行的ID,并用它插入到另一个表中的存储过程

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; 
/

我我得到这个错误:[错误] PLS-00049(59:26 ):PLS-00049:坏绑定变量'V_ID'我认为我需要在某处声明v_id,但我在BEGIN语句之前和之后尝试过,但是那给了另一个错误。

任何想法如何做到这一点?

感谢

+0

除非你有竞争条件,为什么不从序列中获取最后一个Id。 Sequence.CURRVAL如果我没有错。无论是该表还是获取表中最大的Id(自动递增,因此最大=最后一个Id被插入)。 – Sam

+1

@Sam:currval总是安全的,不会受到竞争条件的影响 - 它会返回该会话中最近由nextval返回的相同值。 –

回答

4

更改过程

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; 

分享和享受。

+0

谢谢,它的工作。 – 03Usr

相关问题