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.

上打开游标即可