2013-10-31 45 views
-2

我在PL/pgSQL函數在PostgreSQL中子查詢在PL/pgSQL裏沒有工作

CREATE or replace FUNCTION check_checklist_is_finalizedtest(application_id bigint) 
    RETURNS SETOF record AS 
$BODY$ 
DECLARE 
sqlresult record; 
val boolean:=false; 

BEGIN 

for sqlresult in execute IMMEDIATE 'select distinct mda.application_id maid,mda.document_type_id mdoctypeid, 
dt.multiple_doc dtmdoc,mda.mandatory_doc_application_id mdocaid,COALESCE(ac.doc_correct,false) doccorrect, 
COALESCE((select max(e_certificate_no) from application_document ad 
where ad.application_id=mda.application_id and ad.document_id=mda.document_type_id and multiple_doc=true and ad."valid"=''||New||'' 
),'''||1||''')as no_of_docs, 
(select count(*) from application_document ad2 
where ad2.application_id=mda.application_id and ad2.document_id=mda.document_type_id and ad2."valid"=''||New||'' 
)as count_of_record  
from mandatory_doc_application mda 
inner join document_type dt on(mda.document_type_id=dt.document_id) 
left join application_checklist ac on(ac.man_doc_app_id= mda.mandatory_doc_application_id) 
where mda.application_id='''||$1||'''' 
LOOP  
IF(sqlresult.no_of_docs::bigint=sqlresult.count_of_record and sqlresult.doccorrect=true) then 
    val=true; 
ELSE 
    val=false; 
END IF; 
return next sqlresult; 
END LOOP; 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

函數調用時在SELECT語句子查詢不executed.Hence結果是錯誤的。你可以幫我嗎?

+1

不要卸載你的混亂到這個論壇。以可讀的方式呈現您的代碼,並至少添加基本解釋您正在做的事情。添加你的Postgres版本並描述出了什麼問題(哪個「子查詢」沒有執行?)。 –

回答

1

將您的查詢翻譯爲動態SQL可能有問題。你問題中的代碼很難閱讀,這增加了錯誤的風險。
這奇怪的表情可能沒有你想象的那樣:

and ad2."valid"=''||New||'' 

你期待一個變量,但不聲明和使用字符串常量,而不是存在。

下一個奇怪的事情:關鍵詞IMMEDIATE - PostgreSQL不支持它 - 所以你的代碼不可能被編譯。

問題:

  • 你爲什麼要使用動態SQL?似乎沒有必要這樣做。
  • 如果您使用動態SQL,你爲什麼不使用現代的形式像

    FOR r IN EXECUTE 'SELECT * FROM tab WHERE somecol = $1' USING $1 
    LOOP ... 
    

但你的代碼將是簡單和快速與簡單的SQL:

BEGIN 
    RETURN QUERY SELECT no_of_docs::bigint=count_of_record 
        AND COALESCE(ac.doc_correct,false) = true 
       FROM ...; 
    RETURN; 
END; 

請記住只選擇您實際需要返回的列 - 而不是其他人。

+0

Sir'New'不是一個可變的,它是一個常量字符串。並且我刪除了「IMMEDIATE」。但是結果相同 – Pramil

+0

那麼,爲什麼使用字符串concat操作符?當「新」是恆定的,那麼你不需要動態地連接 –