1

このストアド プロシージャの作成に問題があり、実行時にエラーが発生しました。エラーは、無視された SQL ステートメントと SQL コマンドが正しく終了していないことで構成されていました。すべてのコードがきれいだと思いました。

  • 合計レコードを返し、それを TABLE1 テーブルから RECORD_COUNT 変数に挿入します。

  • RECORD_COUNT がゼロより大きく、データをダンプして TABLE1 テーブルをクリアするかどうかを確認する条件。

  • EXTERNAL_TABLE テーブルから TABLE1 テーブルに挿入するために、RECORD_COUNT がゼロに等しいかどうかを確認する条件。

手伝ってください。

    CREATE OR REPLACE PROCEDURE sp_INSERT
    (RECORD_COUNT OUT NUMBER)
    IS
    BEGIN   

         SELECT COUNT(*) 
             INTO RECORD_COUNT
             FROM TABLE1;   

         IF RECORD_COUNT > 0 THEN 
             EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE1'
         END IF;     

        IF RECORD_COUNT = 0 THEN 
        INSERT INTO TABLE1
            (
                JOB_ID,                         
                NUM_SP1,              
                NUM_SP2,              
                NUM_SP3,              
                NUM_SP4,                         
            )
            (SELECT JOB_ID,               
                NUM_SP1,              
                NUM_SP2,              
                NUM_SP3,              
                NUM_SP4,              
            FROM EXTERNAL_TABLE)
        COMMIT;
        END IF;
    END;
4

4 に答える 4

3

最初;:手順の最後に 必要です。
2 番目: DDLTRUNCATEコマンドです。DDL コマンドは plsql では無効です。代わりにコマンドを使用するか、 EXECUTE IMMEDIATE ステートメントを使用できます 。3 番目:ここここを参照してください。DELETE
insert-select statement

CREATE OR REPLACE PROCEDURE sp_INSERT
    (RECORD_COUNT OUT NUMBER)
    IS
    BEGIN   
         SELECT NVL(COUNT(*),0) 
             INTO RECORD_COUNT
             FROM TABLE1;    

         IF RECORD_COUNT > 0 THEN 
             EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE1';
         END IF; 
         -- or
         IF RECORD_COUNT > 0 THEN 
             DELETE TABLE1;
         END IF; 


        IF RECORD_COUNT = 0 THEN 
        INSERT INTO TABLE1
            (
                JOB_ID,                         
                NUM_SP1,              
                NUM_SP2,              
                NUM_SP3,              
                NUM_SP4                         
            )
            SELECT JOB_ID,               
                NUM_SP1,              
                NUM_SP2,              
                NUM_SP3,              
                NUM_SP4              
            FROM EXTERNAL_TABLE;
        COMMIT;
        END IF;
    END;

/*
 VAR N NUMBER;
     EXCE SP_INSERT(:N);
        PRINT N;


             N
         ----------
             0

          INSERT INTO TABLE1 VALUES(1,1,1,1,1);
      INSERT INTO TABLE1 VALUES(1,1,1,1,1);
     INSERT INTO TABLE1 VALUES(1,1,1,1,1);

     COMMIT;
       VAR N NUMBER;
        EXCE SP_INSERT(:N);
        PRINT N;

             N
          -------
             3

      */
于 2013-10-01T17:26:22.383 に答える
1

SELECTステートメントの後にセミコロンがありません。次のようなものが必要です

SELECT COUNT(*) 
  INTO RECORD_COUNT
  FROM TABLE1;   

また、DDL (のようなTRUNCATE) を静的 SQL として PL/SQL に入れることもできません。動的 SQL を使用する必要があります。そのステートメントの最後にセミコロンも必要です。

EXECUTE IMMEDIATE 'TRUNCATE TABLE table1';

正確なエラー スタック (行番号を含む) を投稿することは常に役に立ちます。一般に、コンパイラは、人間がフォーラムの投稿を読むよりも構文エラーを検出するのに優れています。

于 2013-10-01T17:24:59.957 に答える
0

CREATE OR REPLACE PROCEDURE EMP_INSERT (RECORD_COUNT OUT NUMBER) が開始されました

     SELECT COUNT(*) 
         INTO RECORD_COUNT
         FROM EMPEE1;   
          IF RECORD_COUNT > 0 THEN 
         EXECUTE IMMEDIATE 'TRUNCATE TABLE EMPEE1';
     END IF; 

     SELECT COUNT(*) 
         INTO RECORD_COUNT
         FROM EMPEE1;  

    IF RECORD_COUNT = 0 THEN 
    INSERT INTO EMPEE1
        (
            ENO,                         
            ENAME,              
            DOJ,              
            DEPTNO,              
            SAL,
            AGE                         
        )
        (SELECT ENO,               
            ENAME,              
            DOJ,              
            DEPTNO,              
            SAL,
            AGE              
        FROM EMPEE);

    COMMIT;
    END IF;
    END;
于 2014-08-06T12:57:46.283 に答える