如何在Oracle PL/SQL中设置变量并将其用于select语句

vi4fp9gy  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(187)

我在Oracle SQL Developer中尝试了此代码,并返回错误“此SELECT语句中需要INTO子句”

declare 
flag_id_header int;
begin

select NVM(MAX(A.ID),0) as VAL into flag_id_header from TBL_FUNDING_HEADER A;
flag_id_header := flag_id_header + 1;

select flag_id_header, B.DATE_OF_TRANSACTION
from TBL_FUNDING_SOURCE B
;

end;

在Sql Server中,我可以很容易地做到这一点

declare @var1 int = 1;

select @var1, col1, col2, col3 from tbl_whatever

在将它们插入临时表之前,我需要选择此选项。

at0kjp5o

at0kjp5o1#

不要使用MAX来查找序列中的下一个值;如果您有两个用户运行并发语句,则他们将获得相同的值,并且您将具有重复的条目。
使用序列。

CREATE SEQUENCE flag_id_header__seq;

然后递增序列并插入:

DECLARE
  v_id YOUR_TEMP_TABLE.COLUMN1%TYPE;
BEGIN
  -- Set the variable to the next sequence value.
  v_id := flag_id_header__seq.NEXTVAL;

  -- Use the sequence value in the insert.
  INSERT INTO your_temp_table (column1, column2)
  SELECT v_id,
         DATE_OF_TRANSACTION
  FROM   TBL_FUNDING_SOURCE;
END;
/

我想我忘了提到,首先要插入TBL_FUNDING_HEADER以获得ID(它是INT PK AUTO INCREMENT),然后我需要将用TBL_FUNDING_SOURCE选择的ID作为FK插入到TBL_FUNDING
Oracle不支持AUTO_INCREMENT;您需要使用GENERATED ALWAYS AS IDENTITY
如果要插入到IDENTITY列中,然后在以后使用该列,请使用带有初始INSERTRETURNING子句。

DECLARE
  v_id TBL_FUNDING_HEADER.ID%TYPE;
BEGIN
  INSERT INTO TBL_FUNDING_HEADER (column1)
  VALUES ('something')
  RETURNING id INTO v_id;

  -- Then use the returned identity value in the insert.
  INSERT INTO your_temp_table (column1, column2)
  SELECT v_id,
         DATE_OF_TRANSACTION
  FROM   TBL_FUNDING_SOURCE;
END;
/

fiddle

相关问题