2013-10-31 10 views
-2

내가 하위 쿼리

기능을 선택 문에 하위 쿼리는 결과가 잘못 executed.Hence되지 않습니다라고합니다 즉

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; 

PostgreSQL을

에 PL/pgSQL의에서 기능이 작동하지 않습니다. 너 나 좀 도와 줄 수있어?

+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'는 분명하지 않습니다. 일정한 문자열입니다. 그리고 "즉시"를 제거했습니다. 그러나 동일한 결과가 나타납니다. – Pramil

+0

그렇다면 문자열 연결 연산자를 사용하는 이유는 무엇입니까? "New"가 상수 일 때 동적으로 concat 할 필요가 없습니다. –