2009-08-13 2 views
0

이 코드의 문제점은 무엇입니까? 그것은WITH 구조에있는 경우

오류에 대한 오류 컴파일 오류를 가져옵니다

PL/SQL: ORA-00933: SQL command not properly ended

텍스트 :

IF iCnt > 0 THEN 


    WITH S600 AS (


Prod_KEY NUMBER; 
iCount  NUMBER;            

BEGIN 
    WITH TEMP_All AS 
      (SELECT * FROM TEMP1 
      UNION ALL 
      SELECT * FROM TEMP2 
      UNION ALL 
      SELECT * FROM TEMP3) 

      SELECT COUNT(*) 
      INTO iCount 
      FROM TEMP_ALL 

      IF iCount > 0 THEN  
        TEMP_OUT AS( 
           SELECT Key1, count(*) as cnt 
           FROM TEMP_ALL), 

         TempKey AS(
         SELECT BarSuid FROM TEMP_OUT 
         WHERE cnt = (SELECT MAX(cnt) FROM TEMP_OUT)); 
       ELSE 
        TempKey AS(
        SELECT Key1 FROM PRODUCT 
        WHERE Key1 NOT IN (SELECT Key1 FROM PRODUCT_DET)); 
       END IF;    

       SELECT key2 
        INTO PROD_KEY 
        FROM PRODUCT,TempKey 
        WHERE PRODUCT.Key1 = TempKey.Key1 
       AND TempKey.Key1 IS NOT NULL; 

EXCEPTION 
    WHEN OTHERS 
    THEN 
     dbms_output.put_line(SQLCode); 

    END; 

답변

1

"WITH S600 AS ("SQL 문을 시작하지만 다음은 ("Prod_KEY NUMBER; iCount NUMBER;") PL/SQL이다. 또한 WITH는 SQL 문을 선언하는 데 사용되지 않습니다. "CURSOR xxx IS SELECT ...;"을 사용하여 선언 된 명시 적 커서를 생각했을 것입니다.

PL/SQL 블록을 DECLARE로 시작해야합니다. 예 :

DECLARE 
    Prod_KEY NUMBER; iCount NUMBER; 
BEGIN 
    SELECT COUNT(*) 
    INTO iCount 
    FROM (SELECT * FROM TEMP1 
      UNION ALL SELECT * FROM TEMP2 
      UNION ALL SELECT * FROM TEMP3); 
    IF iCount > 0 THEN ... 

나는 당신이 거기에서 그것을 가져갈 수 있어야한다고 생각합니다.

2

이것이 더 큰 절차 또는 뭔가의 일부인지는 모르겠지만 질문의 마크 업은 다소 혼란 스럽습니다.

어쨌든, 내가 처음 알 수 있었던 것은 첫 번째 끝에 SELECT의 끝에 세미콜론 (;)을 잊었다는 것입니다. 다음과 같아야합니다.

SELECT COUNT(*) 
INTO iCount 
FROM TEMP_ALL;