1

OracleおよびSQLサーバーに対してアプリをテストするためのテスト環境を構築しようとしています。目的は、両方のテストシナリオで同じコードベースを使用することです。唯一の違いは、スクリプトファイルに格納されているSQL / DDL/...ステートメントです。問題は、OracleのODPがスクリプトの実行をサポートしておらず、単一のコマンドのみをサポートしていることです。

回避策を見つけましたが、解決できない問題が1つあります。

oracleのDropスクリプトは次のようになります。

BEGIN EXECUTE IMMEDIATE 'SELECT ''DROP TABLE '' || table_name || '' CASCADE CONSTRAINTS;'' FROM  user_tables'; EXECUTE IMMEDIATE 'SELECT ''DROP SEQUENCE '' || sequence_name || '';'' FROM user_sequences;'; END[;]

問題は、ENDの後の最後のセミコロンです。

最後にセミコロンを指定しないと、Oracleデータベースが文句を言います。

ORA-06550: line 1, column 208:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
; <an identifier> <a double-quoted delimited-identifier>
The symbol ";" was substituted for "end-of-file" to continue.)

セミコロンを指定すると、oracleODP.Netコマンドオブジェクトによって例外がスローされます。

ORA-00911: invalid character
ORA-06512: at line 1 

OracleデータベースとODP.Netの両方を満たす方法はありますか?

4

1 に答える 1

2

セミコロンの問題は、実際には2回目の実行の即時に存在する可能性があると思います。このように即時実行でSQLを実行している場合、文字列の最後にセミコロンを付けるとエラーが発生します。

ただし、このPL/SQLブロックは実際には何もしません。INTO句を指定せずにPL/SQLブロック内でselectを発行すると、クエリが実行されますが、結果には何も行われません。私はあなたが本当に欲しいものはこのようなものだと思います:

DECLARE
   cursor cur_tables is 
      select 'drop table ' || table_name || ' cascade constraints' as qry
      from user_tables;
   cursor cur_sequences is 
      select 'drop sequence ' || sequence_name as qry
      from user_sequences;
BEGIN
   for r_table in cur_tables loop
      execute immediate r_table.qry;
   end loop;
   for r_sequence in cur_sequences loop
      execute immediate r_sequence.qry;
   end loop;
END;

選択は変更されないため、選択を動的にする理由は実際にはありません。動的SQLは、実際にはクエリ対象のドロップステートメントです。

解説を追加:.NETから実行するために、すぐに実行でラップする必要はありません。ブロックを変更せずに文字列としてデータベースに渡すことができるはずです。

于 2010-03-30T16:38:21.363 に答える