我无法使用 PL/pgSQL(Redshift 环境)将记录插入到 LOOP 语句内的表中;除了添加
insert
语句外,一切正常;并且无法使用 insert
逻辑内的 LOOP
语句创建/修改该过程。
编译错误是
SQL Error \[42601\]: ERROR: syntax error at or near "$1"
Where: SQL statement in PL/PgSQL function "usp_ppv_process_cs_6months" near line 29
我尝试通过添加
insert
语句来修改程序,但它不起作用;尝试编译过程代码时出现 SQL 错误 42601。
create or replace PROCEDURE aigdm.usp_ppv_process_cs_6months() AS $$
DECLARE
po_nbr varchar(50);
po_line_nbr varchar(50);
due_date timestamp;
po_qty int;
po_amt_in_po_currency float8;
rowcount int;
target record;
open_po_cursor cursor for
SELECT
wo_nbr
,po_line_nbr
,txn_date
,txn_qty
,po_amt_in_po_currency
from
aigdm.vw_aig_inventory_mrp
where wo_nbr in ('257360CS','254358CS' );
BEGIN
OPEN open_po_cursor;
po_nbr:= null;
po_line_nbr := null;
due_date := null;
po_qty := null;
po_amt_in_po_currency := null;
LOOP
fetch open_po_cursor into po_nbr,po_line_nbr,due_date,po_qty,po_amt_in_po_currency;
exit when not found;
insert into aigdm.aig_bi_ppv_cs_6months (po_nbr) values (po_nbr);
commit;
RAISE INFO 'a % at ', po_nbr;
END LOOP;
CLOSE open_po_cursor;
END;
$$ LANGUAGE plpgsql;
问题在于您使用的变量名称等于列名称。由于您有一个变量
po_nbr
,您的 INSERT
语句
insert into aigdm.aig_bi_ppv_cs_6months (po_nbr) values (po_nbr)
导致这个准备好的声明
insert into aigdm.aig_bi_ppv_cs_6months ($1) values ($1)
这在语法上是不正确的,因为您不能使用列名参数。
重命名变量将解决问题。
但是这里完全没有必要使用过程。您可以使用单个
INSERT
语句更有效地完成同样的事情:
INSERT INTO aigdm.aig_bi_ppv_cs_6months (po_nbr)
SELECT wo_nbr
FROM aigdm.vw_aig_inventory_mrp
WHERE wo_nbr IN ('257360CS','254358CS' );