2

Oracleで少し問題が発生しました。すでにデータが含まれているテーブルにIDを生成するためのシーケンスを作成しようとしています。次の匿名ブロックを使用しようとしています。

declare y varchar2(2000);
BEGIN
  SELECT 'CREATE SEQUENCE ID_SEQ MINVALUE 1 MAXVALUE 9999999999 START WITH ' || (max(ID)+1) || ' INCREMENT BY 1 CACHE 20;' INTO y FROM TEST_TABLE;
  --dbms_output.put_line(y);
  execute immediate y;
end;

次のエラーが発生します。

Error report:
ORA-00911: invalid character
ORA-06512: at line 5
00911. 00000 -  "invalid character"

y変数の値を実行すると、完全に機能します。SQL Developerを入力インターフェースとして使用し、11gr2Oracleサーバーで作業しています。'INCREMENTBY'パラメーターがスクリプトで生成された同様のコードを見つけました。誰かが私のエラーを説明できますか?

4

1 に答える 1

9

実行execute immediateするコマンドの最後にセミコロンを付けないでください。これは、SQL Developer (およびSQL*Plusやその他のクライアント) のコマンド区切り文字であり、SQL ステートメント自体の一部ではありません。

SELECT 'CREATE SEQUENCE ID_SEQ MINVALUE 1 MAXVALUE 9999999999 START WITH '
    || (max(ID)+1) || ' INCREMENT BY 1 CACHE 20' INTO y FROM TEST_TABLE;

これは、プレーン SQL の例に示されています。ただし、混乱を避けるために、動的 SQL 内で PL/SQL を使用している場合でも、PL/SQL 自体に適切なセミコロンが必要です。ただし/、クライアントから直接実行するために使用する実行ではありません。これは他の例に示されています。

于 2013-03-07T08:58:00.400 に答える