0

このコードの問題点を教えてください。エラーコンパイルエラーが発生します

エラー:

PL/SQL: ORA-00933: SQLコマンドが正しく終了していません

文章:

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;
4

2 に答える 2

2

これがより大きな手順の一部なのか、それとも何かなのかはわかりません。質問のマークアップはちょっと混乱しています。

とにかく、私が気付いたのは、最初のSELECTの最後にセミコロン (;) を忘れていることです。そのはず:

SELECT COUNT(*) 
INTO   iCount
FROM   TEMP_ALL;
于 2009-08-16T06:12:53.467 に答える
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 ...

そこから取り出せばいいと思います。

于 2009-08-14T06:43:18.240 に答える