2017-09-14 11 views
0

テーブル名を指定してプロシージャを作成しようとしていますが、シーケンス名と自動インクリメントトリガが作成されます。テーブル内にトリガーを作成するためのOracleプロシージャ/関数

コード:

CREATE OR REPLACE procedure CREATE_SEQUENTIAL_TR(table_name VARCHAR) 
is -- Tried using declare but it wouldn't accept 
    coluna_cod varchar(100 char); 
begin 
    --Finding the cod column name for this table first 
    --They start with "PK_CD" 
    select 
     COLUMN_NAME 
    into 
     coluna_cod 
    from 
     ALL_TAB_COLUMNS 
    where 
     TABLE_NAME=table_name 
     and COLUMN_NAME like "PK_CD%"; 
    --Creating the sequence obj 
    drop sequence "cod" || table_name; 
    create sequence "cod" || table_name; 
    --Now creating the trigger 
    create or replace trigger "cod" || table_name || "tr"   
    before 
     UPDATE or INSERT on table_name 
    for each row 
    declare 
     cod number := coluna_cod; 
     tr_name varchar(100 char) := "cod" || table_name 
    begin 
     if UPDATING then 
      if :new.cod != :old.cod then 
       :new.cod := :old.cod; 
      end if; 
     else -- inserting 
      :new.cod := tr_name.nextval(); 
     end if; 
    end; 
end; 

これの複雑さはかなり私の知識の範囲の外になってしまいました。

現時点ではdrop sequence "cod" || table_name(予期しないDROPシンボルが見つかりました)にエラーが発生していますが、他のエラーが発生している可能性があります。

誰かがこの論理を理解する手助けができますか?

+0

あなたは、PL/SQLブロックでのDDL文を実行することはできません。 execute immediateを使用するか、スクリプトを作成してsqlplusを実行する必要があります – OldProgrammer

答えて

2

DDL文(dropまたはcreateまたはalterなど)をPL/SQLブロックに直接入れることはできません。あなたがPL/SQL内でDDLを実行したい場合は、execute immediateを行うことができます。

declare 
begin 
    drop sequence X; -- error 
    execute immediate 'drop sequence X'; -- works fine 
end; 
/
関連する問題