5

私はPL/SQLを初めて使用し、Oracle SQL Developerを使用して、シーケンスを使用して既存のデータの主キーを生成し、別のDBに書き込むプロシージャを作成しています

問題のコードはNDAの下にあります..基本的に私は次のものを持っています:

create or replace
PROCEDURE Generate_Data
(
   output IN VARCHAR2
) 
AS

-- Variables here --

CURSOR myCursor IS
SELECT data1, data2 
FROM table;

CREATE SEQUENCE mySequence      <-- error on this line
START WITH 0
INCREMENT BY 1;

BEGIN
LOOP
    -- snip --

エラー PLS-00103 が発生し、begin、function、package、pragma、procedure などを期待しているときにシンボル CREATE が発生したことを示しています。

http://www.techonthenet.com/oracle/sequences.phpの例に従っています 。

4

3 に答える 3

7

このエラーが発生する理由は、PL/SQL 内でDDLを実行しようとしている(この場合はシーケンスを作成している) ためです。これを行うことは可能ですが、使用する必要execute immediateがあります。

アレックスが言うように、このdeclareセクションではこれを行うこともできません。次のようになります。

begin

   execute immediate 'CREATE SEQUENCE mySequence
                          START WITH 0
                          INCREMENT BY 1';    
end;

ただし、Padmaragも述べているように、PL/SQL 内でこれを実行する可能性はほとんどありません。外部でシーケンスを作成し、後でこれを参照する方がより一般的です。より一般的に言えば、PL/SQL ブロック内で DDL を実行することはお勧めできません。あなたがそれをする必要はないはずです。

使用しているOracleのバージョンについては言及していません。11g から、シーケンスにアクセスできる方法が拡張されました。11g を使用している場合は、変数を作成し、シーケンス内の次の値.nextvalをこの変数に割り当てることで、シーケンスにアクセスできます。

declare    
   l_seq number;    
begin

   loop
      -- For each loop l_seq will be incremented.
      l_seq := mysequence.nextval;
   -- snip    
end;

11g より前の場合は、次の値を取得するために( DMLの外部で) select ステートメントを使用する必要があります。

declare
   l_seq number;
begin

   loop
      -- For each loop l_seq will be incremented.
      select mysequence.nextval into l_seq from dual;
   -- snip    
end;

シーケンスは、データベース内の永続オブジェクトであることを意図していることに注意してください。使用するたびに削除して再作成する必要はありません。スクリプトを実行してから再実行すると、シーケンスは喜んで戻り値を増やし続けます。

参考文献

于 2012-07-03T19:44:25.083 に答える
2

プロシージャの DECLARE ブロックでシーケンスを作成することはできません。BEGIN の後に移動します。それが理にかなっていれば、それは議論の余地があります。おそらく、最初にプロシージャの外で作成する必要があります。


アップデート

実際、BEGIN/END 内で本当に必要な場合は、次のように使用します。

EXECUTE IMMEDIATE 'CREATE SEQUENCE mySequence  START WITH 0 INCREMENT BY 1'; 
于 2012-07-03T19:31:37.287 に答える
0

使用する前にシーケンスを作成する必要があります。

PL/SQLコードでは
-- Variables here --1
v_seq_val number;

BEGIN
Select mySequence.nextval from dual into v_seq_val

一般的に、SQL は DDL (データ定義言語) 用であり、PL/SQL は DML (データ操作言語) とロジック用です。

必要に応じて PL/SQL から作成することもできますが、ここではそれが必要ではないと思います。

于 2012-07-03T19:29:09.823 に答える