2017-07-26 20 views
0

根據此過程光標將顯示兩行,但是當我執行此查詢時,它顯示錯誤:光標「無名門戶」不存在 在圖像表錯誤:光標「<無名門戶>」不存在

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'); 

舊的主表

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_nounmodmaster表結構

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') 

在名詞modmaster表中插入三條記錄,但在圖像表中的同義詞包含'car tire'只有兩個nm_codes。所以,當我執行此功能光標將執行除了最後一排nounmodmaster兩行,因爲它不與圖像匹配表

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參數,它是在legacymaster表,如果源數據字符串包含「汽車胎'。然後它會顯示兩行圖像表

我需要

+0

目前還不清楚它試圖做什麼代碼,我們不能運行它,因爲我們沒有引用表的定義。您爲沒有表的查詢打開遊標,然後關閉它,然後返回它。咦?該如何工作?當你調用函數時,你會得到錯誤嗎?你怎麼稱呼它? –

+0

我傳遞遺留的code_in,它是在傳統的主表中的傳統主表 如果源數據字符串包含'汽車輪胎',那麼它將顯示兩行,爲什麼因爲在圖像表中兩行包含'汽車輪胎'字符串使用遊標是可能的。 – Gobinath

+0

我在這裏看不到'CREATE TABLE'語句或'SELECT'語句。 –

回答

0

所有你所得到的錯誤,首先是因爲,除非你特意給光標名稱,Postgres的返回具有特殊名稱的光標「無名比較門戶「,它可以繼續1,2,3等。

這通常是相當無益的,但幸運的是有一個簡單的選擇。您只需通過光標作爲參數的功能,讓你的程序將啓動:

CREATE OR REPLACE FUNCTION func_source_based_nounmod(legacy_code_in character varying, cur refcursor) 

假設你從一個查詢窗口調用這個函數,你現在可以有如下所示的代碼:

BEGIN; 
select func_source_based_nounmod('123', 'mycursor'); 
FETCH ALL IN "mycursor"; 
COMMIT; 

不幸的是,這是容易的一點!考慮到你發佈的數據,哪些BTW格式不正確以及函數中的列丟失,你會看到我沒有像'123'那樣推薦'Car Tyre'。這是必要的,否則你永遠無法打開光標,因爲你有

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中,而不僅僅是一些他們!在這裏,我有一個特殊的問題讓你的代碼運行,因爲你上面的表結構是缺少類別

最後所有這一切都在一個循環中,在這個循環結束時,你打開並關閉了光標。在這樣做的誤會之下,你將能夠用連續的行填充光標,這不是它的工作方式

同樣,你在關閉它之後返回光標(因此原始的錯誤信息) 。爲了能夠訪問遊標,在返回遊標時需要打開遊標。

那麼你如何解決這一切?我的建議是給你使用臨時表。在調用函數之前清除表格。而不是在循環結束時打開和關閉遊標,只需將行添加到臨時表。然後運行從表中讀取的函數。如果需要在遊標中包含結果集,則只需在臨時表上打開遊標即可。

相關問題