ERROR: cursor "<unnamed portal>" does not exist
ERROR: cursor "<unnamed portal>" does not exist
根据这个过程,游标将显示两行,但是当我执行这个查询时,它显示错误:游标 "unnamed portal" 不存在
图片中 table
CREATE TABLE image
(
id numeric(9,0) NOT NULL,
nm_code character varying(100) NOT NULL,
synonym text NOT NULL,
CONSTRAINT synonym_id PRIMARY KEY (id)
)
INSERT INTO image(
id, nm_code, synonym)
VALUES (01,'13160101','CAR TYRE');
INSERT INTO image(
id, nm_code, synonym)
VALUES (01,'10000101','CAR TYRE');
传承大师table
CREATE TABLE legacymaster
(
legacy_code character varying(20),
source_data text,
)
insert into legacymaster (legacy_code,source_data) values ('123','WITH CAR TYRE FROM AUDI 2000')
mm_nounmodmastertable结构
CREATE TABLE mm_nounmodmaster
(
nm_code character varying(18) NOT NULL,
noun character varying(35),
modifier1 character varying(35) NOT NULL,
modifier2 character varying(35),
modifier3 character varying(35),
nm_type character(1) NOT NULL,
nm_abbr character varying(200),
nm_description character varying(80) NOT NULL,
is_template character(1) DEFAULT 'N'::bpchar,
)
INSERT INTO mm_nounmodmaster(nm_code, noun, modifier1, modifier2, modifier3, nm_type, nm_abbr,
nm_description,is_template)
VALUES ("10000101","ABRASIVE","--","--","","F","--","ABRASIVE",'Y')
INSERT INTO mm_nounmodmaster(nm_code, noun, modifier1, modifier2, modifier3, nm_type, nm_abbr,
nm_description,is_template)
VALUES ("13160101","TYRE","AUTOMOBILE","--","","F","TYR,AUTO","TYRE,AUTOMOBILE",'Y')
INSERT INTO mm_nounmodmaster(nm_code, noun, modifier1, modifier2, modifier3, nm_type, nm_abbr,
nm_description,is_template)
VALUES ("10020101","ACTUATOR","ELECTRICAL","--","--","F","ACTR,ELE","ACTUATOR,ELECTRICAL",'Y')
in nounmodmaster table 插入了三个记录但是在image table synonyms contains 'car tyre' 只有两个nm_codes。所以当我执行这个函数时,光标将在 nounmodmaster 中执行两行,除了最后一行,因为它与图像不匹配 table
CREATE OR REPLACE FUNCTION func_source_based_nounmod(legacy_code_in character varying)
RETURNS refcursor AS
$BODY$
declare
source text;
nmcode character varying(50);
v_parent_Rec1 record;
v_parent_Rec2 record;
item_desc character varying(50);
noun_t character varying(50);
mod1 character varying(50);
CUR REFCURSOR;
begin
--select source_data into source from legacymaster where source_data=legacy_code_in;
raise notice '1';
for v_parent_Rec1 in(SELECT id,nm_code,synonym FROM image)loop
raise notice '2';
--if exists (select source_data from legacymaster where legacy_code=legacy_code_in) then
raise notice '3';
IF exists (select source_data from legacymaster where legacy_code=legacy_code_in and source_data ilike '%'||v_parent_Rec1.synonym||'%') THEN
raise notice '4';
FOR v_parent_Rec2 IN(SELECT DISTINCT AA.NM_CODE, NM_TYPE,
(CASE WHEN NM_ABBR IS NOT NULL THEN NM_ABBR ELSE '--' END) as NM_ABBR,
NM_DESCRIPTION, NM_CATEGORY,
(CASE WHEN image.NM_CODE IS NOT NULL THEN 'ACTIVE' ELSE 'INACTIVE' END) as STATUS,
(CASE WHEN NOUN IS NOT NULL AND NOUN <> '--' AND trim(both ' ' from NOUN) <> '' THEN NOUN ELSE '' END) ||
(CASE WHEN MODIFIER1 IS NOT NULL AND MODIFIER1 <> '--' AND TRIM(BOTH ' ' FROM MODIFIER1) <> '' THEN ',' || MODIFIER1 ELSE '' END) ||
(CASE WHEN MODIFIER2 IS NOT NULL AND MODIFIER2 <> '--' AND TRIM(BOTH ' ' FROM MODIFIER2) <> '' THEN ',' || MODIFIER2 ELSE '' END) ||
(CASE WHEN MODIFIER3 IS NOT NULL AND MODIFIER3 <> '--' AND TRIM(BOTH ' ' FROM MODIFIER3) <> '' THEN ',' || MODIFIER3 ELSE '' END) AS NOUNMOD,
is_template, Count(image.nm_code) AS CountOfnm_code from mm_nounmodmaster aa
inner join image on image.nm_code=aa.nm_code
where image.synonym =v_parent_Rec1.synonym and image.nm_code=v_parent_Rec1.nm_code group by aa.nm_code,image.nm_code)LOOP
--raise notice '%',v_parent_Rec2.noun;
--raise notice '%',v_parent_Rec2.modifier1;
END LOOP;
ITEM_DESC:=v_parent_Rec1.nm_code;
raise notice '%',ITEM_DESC;
raise notice '%',v_parent_Rec2.nm_code;
raise notice '%',v_parent_Rec2.NM_TYPE;
raise notice '%',v_parent_Rec2.NM_ABBR;
raise notice '%',v_parent_Rec2.NM_DESCRIPTION;
raise notice '%',v_parent_Rec2.NM_CATEGORY;
raise notice '%',v_parent_Rec2.NOUNMOD;
raise notice '%',v_parent_Rec2.CountOfnm_code;
--end if;
OPEN CUR FOR
SELECT DISTINCT v_parent_Rec2.nm_code,v_parent_Rec2.NM_TYPE,v_parent_Rec2.NM_ABBR,v_parent_Rec2.NM_DESCRIPTION,v_parent_Rec2.NM_CATEGORY,v_parent_Rec2.NOUNMOD,v_parent_Rec2.CountOfnm_code;
close cur;
end if;
end loop;
raise notice '5';
RETURN CUR;
end;
$BODY$
通过传递Legacy_code_in参数,如果源数据字符串包含'Car Tyre',则在legacymastertable中。然后它将显示两行与图像 table
进行比较
我需要
首先,您得到的错误是因为,除非您专门为游标指定一个名称,否则 postgres return 是一个具有特殊名称 "unnamed portal" 的游标,它可以继续 1、2 , 3 等等
这通常没什么用,但幸运的是有一个简单的替代方法。您只需将光标作为参数传递给函数,这样您的过程就会开始:
CREATE OR REPLACE FUNCTION func_source_based_nounmod(legacy_code_in character varying, cur refcursor)
假设您从查询中调用此函数 window 您现在可以拥有如下代码:
BEGIN;
select func_source_based_nounmod('123', 'mycursor');
FETCH ALL IN "mycursor";
COMMIT;
不幸的是,这很容易!鉴于您发布的数据,BTW 格式不正确并且函数中缺少列,您会看到我传入的不是您似乎建议的 'Car Tyre' 而是“123”。这是必要的,否则你永远无法打开游标,因为你有
IF exists (select source_data from legacymaster
where legacy_code=legacy_code_in and
所以legacy_code_in必须匹配legacymaster中的代码。
然后你的问题会变得更糟。
您的后续 SELECT(FOR v_parent_Rec2 IN(SELECT DISTINCT AA.NM_CODE、NM_TYPE 等)中有一个 Count()。这意味着 SELECT 中的所有项目都需要在 Group BY 中,而不仅仅是其中的一些!在这里,我遇到了一个特殊的问题,让你的代码成为 运行,因为你上面的 table 结构缺少类别。
最后这一切都在循环中。在此循环结束时,您打开和关闭游标。您似乎误解了这样做,您将能够用连续的行填充游标。这不是它的工作方式。
类似地,您然后 return 关闭游标(因此出现原始错误消息)。为了能够访问游标,需要在 return 时打开游标。
那么你是如何解决这一切的呢?我建议您使用临时 table。在调用函数之前清除 table。无需在循环结束时打开和关闭游标,只需将行添加到临时 table。然后在 运行ning 函数从 table 读取之后。如果需要将结果集放在游标中,只需在临时 table.
上打开游标即可
根据这个过程,游标将显示两行,但是当我执行这个查询时,它显示错误:游标 "unnamed portal" 不存在 图片中 table
CREATE TABLE image
(
id numeric(9,0) NOT NULL,
nm_code character varying(100) NOT NULL,
synonym text NOT NULL,
CONSTRAINT synonym_id PRIMARY KEY (id)
)
INSERT INTO image(
id, nm_code, synonym)
VALUES (01,'13160101','CAR TYRE');
INSERT INTO image(
id, nm_code, synonym)
VALUES (01,'10000101','CAR TYRE');
传承大师table
CREATE TABLE legacymaster
(
legacy_code character varying(20),
source_data text,
)
insert into legacymaster (legacy_code,source_data) values ('123','WITH CAR TYRE FROM AUDI 2000')
mm_nounmodmastertable结构
CREATE TABLE mm_nounmodmaster
(
nm_code character varying(18) NOT NULL,
noun character varying(35),
modifier1 character varying(35) NOT NULL,
modifier2 character varying(35),
modifier3 character varying(35),
nm_type character(1) NOT NULL,
nm_abbr character varying(200),
nm_description character varying(80) NOT NULL,
is_template character(1) DEFAULT 'N'::bpchar,
)
INSERT INTO mm_nounmodmaster(nm_code, noun, modifier1, modifier2, modifier3, nm_type, nm_abbr,
nm_description,is_template)
VALUES ("10000101","ABRASIVE","--","--","","F","--","ABRASIVE",'Y')
INSERT INTO mm_nounmodmaster(nm_code, noun, modifier1, modifier2, modifier3, nm_type, nm_abbr,
nm_description,is_template)
VALUES ("13160101","TYRE","AUTOMOBILE","--","","F","TYR,AUTO","TYRE,AUTOMOBILE",'Y')
INSERT INTO mm_nounmodmaster(nm_code, noun, modifier1, modifier2, modifier3, nm_type, nm_abbr,
nm_description,is_template)
VALUES ("10020101","ACTUATOR","ELECTRICAL","--","--","F","ACTR,ELE","ACTUATOR,ELECTRICAL",'Y')
in nounmodmaster table 插入了三个记录但是在image table synonyms contains 'car tyre' 只有两个nm_codes。所以当我执行这个函数时,光标将在 nounmodmaster 中执行两行,除了最后一行,因为它与图像不匹配 table
CREATE OR REPLACE FUNCTION func_source_based_nounmod(legacy_code_in character varying)
RETURNS refcursor AS
$BODY$
declare
source text;
nmcode character varying(50);
v_parent_Rec1 record;
v_parent_Rec2 record;
item_desc character varying(50);
noun_t character varying(50);
mod1 character varying(50);
CUR REFCURSOR;
begin
--select source_data into source from legacymaster where source_data=legacy_code_in;
raise notice '1';
for v_parent_Rec1 in(SELECT id,nm_code,synonym FROM image)loop
raise notice '2';
--if exists (select source_data from legacymaster where legacy_code=legacy_code_in) then
raise notice '3';
IF exists (select source_data from legacymaster where legacy_code=legacy_code_in and source_data ilike '%'||v_parent_Rec1.synonym||'%') THEN
raise notice '4';
FOR v_parent_Rec2 IN(SELECT DISTINCT AA.NM_CODE, NM_TYPE,
(CASE WHEN NM_ABBR IS NOT NULL THEN NM_ABBR ELSE '--' END) as NM_ABBR,
NM_DESCRIPTION, NM_CATEGORY,
(CASE WHEN image.NM_CODE IS NOT NULL THEN 'ACTIVE' ELSE 'INACTIVE' END) as STATUS,
(CASE WHEN NOUN IS NOT NULL AND NOUN <> '--' AND trim(both ' ' from NOUN) <> '' THEN NOUN ELSE '' END) ||
(CASE WHEN MODIFIER1 IS NOT NULL AND MODIFIER1 <> '--' AND TRIM(BOTH ' ' FROM MODIFIER1) <> '' THEN ',' || MODIFIER1 ELSE '' END) ||
(CASE WHEN MODIFIER2 IS NOT NULL AND MODIFIER2 <> '--' AND TRIM(BOTH ' ' FROM MODIFIER2) <> '' THEN ',' || MODIFIER2 ELSE '' END) ||
(CASE WHEN MODIFIER3 IS NOT NULL AND MODIFIER3 <> '--' AND TRIM(BOTH ' ' FROM MODIFIER3) <> '' THEN ',' || MODIFIER3 ELSE '' END) AS NOUNMOD,
is_template, Count(image.nm_code) AS CountOfnm_code from mm_nounmodmaster aa
inner join image on image.nm_code=aa.nm_code
where image.synonym =v_parent_Rec1.synonym and image.nm_code=v_parent_Rec1.nm_code group by aa.nm_code,image.nm_code)LOOP
--raise notice '%',v_parent_Rec2.noun;
--raise notice '%',v_parent_Rec2.modifier1;
END LOOP;
ITEM_DESC:=v_parent_Rec1.nm_code;
raise notice '%',ITEM_DESC;
raise notice '%',v_parent_Rec2.nm_code;
raise notice '%',v_parent_Rec2.NM_TYPE;
raise notice '%',v_parent_Rec2.NM_ABBR;
raise notice '%',v_parent_Rec2.NM_DESCRIPTION;
raise notice '%',v_parent_Rec2.NM_CATEGORY;
raise notice '%',v_parent_Rec2.NOUNMOD;
raise notice '%',v_parent_Rec2.CountOfnm_code;
--end if;
OPEN CUR FOR
SELECT DISTINCT v_parent_Rec2.nm_code,v_parent_Rec2.NM_TYPE,v_parent_Rec2.NM_ABBR,v_parent_Rec2.NM_DESCRIPTION,v_parent_Rec2.NM_CATEGORY,v_parent_Rec2.NOUNMOD,v_parent_Rec2.CountOfnm_code;
close cur;
end if;
end loop;
raise notice '5';
RETURN CUR;
end;
$BODY$
通过传递Legacy_code_in参数,如果源数据字符串包含'Car Tyre',则在legacymastertable中。然后它将显示两行与图像 table
进行比较我需要
首先,您得到的错误是因为,除非您专门为游标指定一个名称,否则 postgres return 是一个具有特殊名称 "unnamed portal" 的游标,它可以继续 1、2 , 3 等等
这通常没什么用,但幸运的是有一个简单的替代方法。您只需将光标作为参数传递给函数,这样您的过程就会开始:
CREATE OR REPLACE FUNCTION func_source_based_nounmod(legacy_code_in character varying, cur refcursor)
假设您从查询中调用此函数 window 您现在可以拥有如下代码:
BEGIN;
select func_source_based_nounmod('123', 'mycursor');
FETCH ALL IN "mycursor";
COMMIT;
不幸的是,这很容易!鉴于您发布的数据,BTW 格式不正确并且函数中缺少列,您会看到我传入的不是您似乎建议的 'Car Tyre' 而是“123”。这是必要的,否则你永远无法打开游标,因为你有
IF exists (select source_data from legacymaster
where legacy_code=legacy_code_in and
所以legacy_code_in必须匹配legacymaster中的代码。
然后你的问题会变得更糟。
您的后续 SELECT(FOR v_parent_Rec2 IN(SELECT DISTINCT AA.NM_CODE、NM_TYPE 等)中有一个 Count()。这意味着 SELECT 中的所有项目都需要在 Group BY 中,而不仅仅是其中的一些!在这里,我遇到了一个特殊的问题,让你的代码成为 运行,因为你上面的 table 结构缺少类别。
最后这一切都在循环中。在此循环结束时,您打开和关闭游标。您似乎误解了这样做,您将能够用连续的行填充游标。这不是它的工作方式。
类似地,您然后 return 关闭游标(因此出现原始错误消息)。为了能够访问游标,需要在 return 时打开游标。
那么你是如何解决这一切的呢?我建议您使用临时 table。在调用函数之前清除 table。无需在循环结束时打开和关闭游标,只需将行添加到临时 table。然后在 运行ning 函数从 table 读取之后。如果需要将结果集放在游标中,只需在临时 table.
上打开游标即可