0

以下の手順は正常にコンパイルされました。しかし、実行しようとするとエラーが発生します。

CREATE OR REPLACE PROCEDURE SAMPLE_PROCEDURE 
AS
VARIABLE1 VARCHAR2(2000);
BEGIN
VARIABLE1:='DECLARE A TIMESTAMP:=LOCALTIMESTAMP; 
CREATE GLOBAL TEMPORARY TABLE TEMP_BWXROW
   (ROW_ID NUMBER(10),DIVISION VARCHAR2(256),OUTLET VARCHAR2(256),CLASS VARCHAR2(256));';

EXECUTE IMMEDIATE VARIABLE1;
END;

エラーは次のとおりです。

6550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

助けてくれませんか、これの何が問題なのですか。

4

2 に答える 2

0

これの何が問題なのかというと、ほぼ確実に実行時にテーブルを作成するべきではなく、動的 PL/SQL を使用するべきではなく、動的 PL 内で動的にテーブルを作成するべきではないということです。 /SQL ブロック。

そうすることが絶対に決定されている場合は、CREATE TABLEステートメント自体が動的 PL/SQL ブロック内で動的 SQL を使用する必要があります。すべての引用符を正しくエスケープした場合、次のような結果になります

CREATE OR REPLACE PROCEDURE SAMPLE_PROCEDURE 
AS
  VARIABLE1 VARCHAR2(2000);
BEGIN
  VARIABLE1:='DECLARE 
                A TIMESTAMP:=LOCALTIMESTAMP; 
              BEGIN
                EXECUTE IMMEDIATE ''CREATE GLOBAL TEMPORARY TABLE TEMP_BWXROW
                                    (ROW_ID NUMBER(10),
                                     DIVISION VARCHAR2(256),
                                     OUTLET VARCHAR2(256),
                                     CLASS VARCHAR2(256))'';
              END;';

  EXECUTE IMMEDIATE VARIABLE1;
END;

ただし、自分のシステムの 1 つでこれを行っているコードに出くわした場合、元の開発者と非常に強い言葉で会話して、問題が発生した場合は動的 PL/SQL を実行する PL/SQL が必要であると信じるに至った理由を理解します。ブロック自体が動的 SQL ステートメントを実行しました。

于 2013-04-10T18:08:43.293 に答える
0

グローバル一時テーブルを動的に作成するのは非常に奇妙です。とにかく、これはすべて学習演習の一部だと思います...

これを試して:

CREATE OR REPLACE PROCEDURE SAMPLE_PROCEDURE 
AS
  VARIABLE1 VARCHAR2(2000);
BEGIN
  VARIABLE1:='DECLARE A TIMESTAMP:=LOCALTIMESTAMP; 
              BEGIN
              CREATE GLOBAL TEMPORARY TABLE TEMP_BWXROW
                (ROW_ID NUMBER(10),
                 DIVISION VARCHAR2(256),
                 OUTLET VARCHAR2(256),
                 CLASS VARCHAR2(256));
              END';

  EXECUTE IMMEDIATE VARIABLE1;
END;
于 2013-04-10T18:02:31.150 に答える