2011-12-16 15 views
1

一部のInformix ESQLをOracle Pro * Cに変換しようとしています。既存のInformixコードでは、 "SERIAL"データ型を使用して自動的にインクリメントする列を示しました。 Oracleのマニュアルによれば、Informix用のOracle Migration Workbenchはこれを処理できる必要があり、関連するOracleシーケンスおよびトリガーを使用して「SERIAL」データ型を「NUMBER」に変換することが説明されています。しかし、ツールを実行しようとすると、単に "SERIAL"という語句が "ERROR(SERIAL)"に置き換えられますので、手動でトリガ/シーケンスを追加しようとしています。Pro * CのOracle NUMBER/Sequence/TriggerへのInformix "SERIAL"

ここの例:http://docs.oracle.com/html/B16022_01/ch2.htm#sthref112は、これを実行できる方法を示しています。シーケンスは、そのようなトリガーを作成しようとすると、しかし、かなりまっすぐ進むように見える:

CREATE TRIGGER clerk.TR_SEQ_11_1 
BEFORE INSERT ON clerk.JOBS FOR EACH ROW 
BEGIN 
SELECT clerk.SEQ_11_1.nextval INTO :new.JOB_ID FROM dual; END; 

のPro * Cプリプロセッサは、ここで「CREATE」のキーワードをピックアップして、私が使用することを許可されていないよと判断しますホスト変数 ":new.JOB_ID"。これは、ホスト変数を "CREATE"ステートメントと一緒に使用することができないためです。

私の質問は、ホスト変数を使用して列名を指定せずに特定の列にOracleシーケンスをリンクするトリガーを作成する方法はありますか? Oracleのマニュアルには、移行ツールが対処できなければならないことが示されています。つまり、これを実行する方法がいくつかあることを意味します。しかし、私が見つけたすべてのトリガ使用例は、プリプロセッサに不平を言うホスト変数を使用しています。

ありがとうございます。

(注:私は、上記の例では、Oracleのドキュメントの例からのトリガ/シーケンス/列名を使用しました)

+0

なぜSQLスクリプトでトリガーを作成しないのですか?私はCプログラムの中からこれを行う必要はないと思う。 –

+0

既存のESQLプログラムはCで書かれています。私の仕事はPro * Cを使用するように既存のコードを変更することです。残念ながら、私はそれがどのように機能するかについて多くを変える権限はありません。 –

答えて

1

私は「EXECUTE IMMEDIATEをEXEC SQL」を使用して問題を解決するために管理ステートメント。

char sql_buf[4096+1]; 
snprintf(sql_buf, 4096, <sql>); 
EXEC SQL IMMEDIATE :sql_buf; 

これはプリプロセッサをバイパスするため、この文は苦情なしで通過できます。

0

"ホスト変数"を使用して列名を指定せずにOracleシーケンスを特定の列にリンクするトリガーを作成することはできません。ところで、それは "ホスト変数"ではなく、ただの参照です。たとえば、同じトリガーが更新や挿入時に起動する可能性があるため、参照する内容を指定する必要があります。新旧の変数です。 MS-SQLでは実行できますが、Oracleでは実行できません。

関連する問題