1

一部の Informix ESQL を Oracle Pro*C に変換しようとしています。既存の Informix コードでは、「SERIAL」データ型を使用して、列が自動的にインクリメントされることを示していました。Oracle のドキュメントによると、Oracle Migration Workbench for Informix はこれを処理できるはずであり、関連する Oracle シーケンスとトリガーを使用して "SERIAL" データ型を "NUMBER" に変換すると説明されています。ただし、ツールを実行しようとすると、「SERIAL」という単語が「ERROR(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 ドキュメントの例のトリガー/シーケンス/列名を使用しました。)

4

2 に答える 2

1

「EXEC SQL EXECUTE IMMEDIATE」ステートメントを使用して問題を解決できました。

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

これにより、プリプロセッサがバイパスされるため、問題なくステートメントを通過できます。

于 2011-12-21T15:51:58.490 に答える
0

「ホスト変数」を使用して列名を指定しないと、Oracleシーケンスを特定の列にリンクするトリガーを作成することはできません。ちなみに、「ホスト変数」ではありません-参照のみです。たとえば、更新時と挿入時に同じトリガーが起動する可能性があるため、参照しているものを指定する必要があります: 新しい変数または古い変数。MS-SQL では実行できますが、Oracle では実行できません。

于 2012-10-22T15:51:45.497 に答える