在 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 和列名的双引号。这是我如果可能的话 避免的事情,并建议您也这样做。
我正在将 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 和列名的双引号。这是我如果可能的话 避免的事情,并建议您也这样做。