【发布时间】:2018-03-07 05:05:13
【问题描述】:
我正在尝试编写如下查询:
例如:
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。
【问题讨论】:
-
谷歌搜索了很多论坛后,我发现,大多数人都说这是不可能的。我宁愿将值存储到局部变量并使用它们重新插入。但是,我有很多相互链接的子表,所以,这样做会很忙。
-
该功能似乎毫无意义,因为您在那里丢失的数字与序列相同(因为您正在提交更新)。但是一个序列会更快,并且会更好地扩展