sql - 用select子句在oracle中编写一个返回id的插入语句

标签 sql oracle plsql

我正在尝试按如下方式编写查询:

例如:

 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

这意味着您要么必须重写该代码,要么查看 returning with insert..select 中描述的解决方法。文章(由阿德里安·比灵顿撰写)。

顺便说一句,普通的 Oracle 序列不适合您的目的吗?不会是无间隙的,但会简单而有效。使用您的解决方案插入大量数据时,请注意性能。

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

关于sql - 用select子句在oracle中编写一个返回id的插入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49144508/

相关文章:

sql - Oracle中如何将select语句的结果存储到临时表中?

oracle - 在oracle plsql中使用触发器填充代理键的优点

mysql - 在 mysql 的触发器中调用函数

php - 如何防止 PrestaShop 在订单验证后更新产品数量

sql - 如何在时间未知时按日期删除行

java - SQL 关闭连接 - 需要增加超时吗?

python - Oracle SQL 中的字符串匹配和表连接

mysql - GROUP BY x = DISTINCT(所有列 - x)吗?

spring - MyBatis DB_VENDOR 不起作用

oracle - SQL避免在select语句中调用同一个函数两次