2011-04-07 4 views
2

저장 프로 시저에서 WITH을 사용하려하지만 실패했습니다. 내 가정은 내 SELECT 성명의 일부로 WITH을 사용할 수 있다는 것이 었습니다. 가능하다면 나는 확신 할 수 없다. 나는 잘못하고있다. 불가능하다.WITH 프로 시저 내에서 사용

나는 다음의 모두를 시도했지만, 모두는 WITH

시도 한 다음 AS에 오류가 발생 :

SET p_temp = (
    WITH 
     temp (id) AS (
      SELECT orgs.id 
      FROM orgstruct.tOrgs AS orgs 
      WHERE orgs.prnt = p_OrgID 
     ) 
    SELECT 1 
    FROM temp 
    FETCH FIRST 1 ROWS ONLY); 

시도 2 ​​:

IF EXISTS (
     WITH 
      temp (id) AS (
       SELECT orgs.id 
       FROM orgstruct.tOrgs AS orgs 
       WHERE orgs.prnt = p_OrgID 
      ) 
     SELECT 1 
     FROM temp) THEN 
    SET p_temp = 1; 
END IF; 

이인가 유일한 해결책은 각각에 대한보기를 만들려면 WITH 일반적으로 사용하고 싶습니까?

+0

이 http://www.orafaq.com/node/1879 – ashishjmeshram

+0

내가 명령 줄에서 쿼리를 실행 아무 문제가없는거야 참조 문제입니다. 이것은 나의 혼란의 근원이다 :'WITH'가없는'SELECT' 문은 괜찮지 만 프로 시저를 만들려고 할 때'WITH'는 오류를 던집니다. – Matt

답변

1

나는 다음과 같이가는 결국 : 하나 개 이상의 레코드가 존재 한 경우

DECLARE p_exists SMALLINT; 

DECLARE c1 CURSOR 
    WITHOUT HOLD 
    WITHOUT RETURN 
    FOR 
     WITH 
      cte AS (SELECT x FROM y) 
     SELECT 1 
     FROM cte 
     FETCH FIRST 1 ROWS ONLY 
    FOR READ ONLY 
    OPTIMIZE FOR 1 ROWS; 
OPEN c1; 
SET p_exists = 0; 
FETCH c1 INTO p_exists; 
CLOSE c1; 

p_exists이고, 그렇지 않으면 내가 커서를 사용하지 않는 것이 기대했던 0 이지만, 여전히 뷰에 바람직입니다 .

1

어떻게

with cte as 
(
SELECT COUNT(orgs.id) as cte_result 
      FROM orgstruct.tOrgs AS orgs 
      WHERE orgs.prnt = p_OrgID 
) 
select 
    case 
     when cte.cte_result > 0 
      then '>0' 
     else '=0' 
    end 
from cte 

에 대한 반환 '> 0'또는 '= 0'결과. 확실히

뷰 또는 커서에 대한 필요가 없습니다 ...

0

당신의 표정이 정말 일치하는 행의 존재 여부에 따라 스칼라 값을 반환하는 경우, 그는 CTE를 사용하지 않고 저장 프로 시저 내에서 수행 할 수 있습니다

SELECT CASE WHEN (EXISTS (SELECT 1 FROM orgstruct.tOrgs AS orgs WHERE orgs.prnt = p_OrgID)) 
    THEN 1 
    ELSE 0 
    END 
INTO p_exists 
FROM sysibm.sysdummy1 
; 

실제로 CTE가 필요한 정교한 쿼리의 경우 CTE를 사용자 정의 함수 내에 포함시킨 다음 저장 프로 시저에서 함수를 호출 할 수도 있습니다. 내가 저장 프로 시저에서 같은 쿼리를 사용하려고하면

관련 문제