在 refcursor postgresql 中设置别名

Setting alias names within refcursor postgresql

我正在将 oracle rest 调用转换为 postgres 函数。我想将列值存储在别名中,并使用别名将数据存储在 table 中。下面是代码。

 DECLARE 
 l_cursor_1    REFCURSOR;
BEGIN
testId :=0;
pack_id :=0;
newtestId :=0;
currrunId :=0;

select CURRENT_TIMESTAMP into nowtimestamp;

OPEN l_cursor_1 FOR
select 'copyof_'|| "NAME" AS testname,"DESCRIPTION" AS testdesc,"TARGET_DATE" AS target_date 
from "TEST_TABLE" where "ID"=testId;

fetch l_cursor_1 into  testname, testdesc, target_date;

insert into "TEST_TABLE" ("NAME","DESCRIPTION","TARGET_DATE", "CURR_TIMESTAMP") values 
(name, testdesc, target_date, nowtimestamp);
END;

数据存在于 table 中,但是在获取值时返回空值。这段代码有什么问题? 谢谢。

首先你的脚本没有返回空值,它没有插入任何东西,因为它不是 运行ning 由于语法错误。
在 plpgsql 中您不能定义变量 'on-the-fly'。在引用之前,所有变量都必须在声明部分(以 declare 开头)中定义。因此,您的变量 testid 到 nowtimestamp 不存在,并且在执行部分(以 begin 开头)给出错误,即使除了 testid 之外,您没有使用它们。
其次,fetch语句中使用的变量也需要声明。您在 select 中为它们添加了别名这一事实并不重要;它们仅在对游标或基于游标的记录的引用中定义。
在程序上,您只会处理一行,因为您只执行一次提取。如果您的意图是处理单个随机行,那很好。但我假设你想要它们,同时假设 id 不是唯一的,就好像你不需要游标一样。所以 fetch 需要在循环中(或游标 for 语句)。
最后,作为一个匿名块,整个东西必须包含在"DO $$ ... $$"中。考虑到所有这些,我们得到:

do $$
declare 
 l_cursor_1    refcursor;
 testId    "TEST_TABLE"."ID"%TYPE =0;
 pack_id   integer =0;
 newtestId integer =0;
 currrunId integer =0;

 nowtimestamp  "TEST_TABLE"."CURR_TIMESTAMP"%type = current_timestamp; 

 testname    "TEST_TABLE"."NAME"%type;
 testdesc    "TEST_TABLE"."DESCRIPTION"%type;
 target_date "TEST_TABLE"."TARGET_DATE"%type;

begin
    open l_cursor_1 FOR
        select 'copyof_'|| "NAME" AS testname
             , "DESCRIPTION" AS testdesc
             , "TARGET_DATE" AS target_date 
          from "TEST_TABLE" 
         where "ID"= testId;

    loop 
        fetch l_cursor_1 into  testname, testdesc, target_date;
        exit when not found;

        insert into "TEST_TABLE" ("NAME","DESCRIPTION","TARGET_DATE", "CURR_TIMESTAMP") 
             values (testname, testdesc, target_date, nowtimestamp);
    end loop; 
end; 
$$;

我想如果我不提到不需要整个脚本就是我的失职。这可以在一条语句中完成(并且做得更好):

insert into "TEST_TABLE" ("NAME","DESCRIPTION","TARGET_DATE", "CURR_TIMESTAMP") 
     select "NAME","DESCRIPTION","TARGET_DATE", current_timestamp
       from "TEST_TABLE"
      where "ID" = 0;  

免责声明。该脚本应该 运行,但尚未经过测试。因此语法错误是可能的。如果是这样,请先查看 table 和列名的双引号。这是我如果可能的话 避免的事情,并建议您也这样做。