2009-08-13 5 views
0

このコードの問題点を教えてください。それはWITH構造のIF

エラーのエラーコンパイルエラーを取得:

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;