簡體   English   中英

用select子句在oracle中編寫一個返回id的插入語句

[英]Write an insert statement with select clause returning id in oracle

我正在嘗試按如下方式編寫查詢:

例如:

 DECLARE 
 V_Output varchar(20):='';

 BEGIN
   INSERT INTO T(ID, MY_PK, NAME, VALUE)
   (SELECT ID, NEXT_TRAN_VALUE('T'), NAME, VALUE FROM T WHERE MY_PK = 'NO0000000000013');
   RETURNING MY_PK INTO V_Output;
   DBMS_OUTPUT.PUT(V_Output);
 END;

使用以下功能

create or replace FUNCTION NEXT_TRAN_VALUE (field IN VARCHAR2)   RETURN 
VARCHAR2
IS
n_value   VARCHAR2 (20);
P_APR     VARCHAR2(3);

CURSOR rec_exists IS SELECT * FROM TRANSACTION_SEQ where SEQ_NAME = field ;      
jk_seq_rec  TRANSACTION_SEQ%ROWTYPE;   
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
SELECT LC_CODE into P_APR FROM LOCATION_CONFIG;
OPEN rec_exists;
FETCH rec_exists INTO jk_seq_rec;

IF rec_exists%FOUND THEN
    UPDATE TRANSACTION_SEQ SET curr_value =   curr_value + 1 WHERE SEQ_NAME = field;
    COMMIT;
END IF;

--SELECT curr_value INTO n_value FROM TRANSACTION_SEQ WHERE SEQ_NAME = field; 
END;

但是,它顯示錯誤。

select 語句應始終返回要插入的單個語句,因此在我看來,它應該返回插入行的my_pk

那行不通。 RETURNING子句不能按照您的方式使用,即

insert into t (id, my_pk)
select some_id, your_function from ...
returning into v_output

但如果你插入VALUES會起作用,因為

insert into t
values (id, your_function)
returning my_pk into v_output

這意味着您要么必須重寫該代碼,要么查看使用 insert..select 返回的文章(由 Adrian Billington 編寫)中描述的解決方法

順便說一句,普通的 Oracle 序列不適合您的目的嗎? 不會是無間隙的,但會簡單而有效。 使用您的解決方案插入大量數據時,請注意性能。

BTW #2,你函數中最后一行的目的是什么? 你從不使用 N_VALUE。

我使用Cursor來解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM