- - PR -
Pro*Cでのテーブル名指定
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-07-10 21:08
Oracle Pro*Cの初心者です。
書籍やインターネットで調べたのですが、いまひとつ良い情報が 見つけられませんでした。 そこで、有識者のご意見をお伺いしたく、質問させていただきます。 Pro*Cの静的SQLを使用する際、テーブル名をホスト変数に設定して 指定することは可能なのでしょうか? 例えば、以下のような感じです。 # 途中省略で、ポイントだけです。
コンパイルして試せれば良いのですが、現在は、 Pro*Cのコンパイル環境が使用可能な状態にないため、 机上で悩んでいます。 以上、よろしくお願いいたします。 | ||||
|
投稿日時: 2007-07-10 22:07
"動的SQL"という単語はご存知でしょうか?
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19273-01/toc.html 結論から言うと、Pro*Cでテーブル名のパラメータ指定はできないです。 その場合にはSQL文を作成し、動的SQLで処理します。 上記URLで「動的SQL 方法4」を参考になさってください。 _________________ 片桐 継(Tugu Katagiri)@わんくま同盟 http://blogs.wankuma.com/esten [ メッセージ編集済み 編集者: 片桐 継 編集日時 2007-07-10 22:08 ] | ||||
|
投稿日時: 2007-07-10 22:52
片桐様
ご回答ありがとうございます。 やはり、静的SQLでテーブル名を動的に指定するのは無理なのですね。 "動的SQL"は、存じております。 動的SQLの説明に"テーブル名、カラム名を動的に指定可能"というようなことが書いて ありました。 動的SQLの存在意義を考えると、静的SQLでテーブル名を変数で指定するのは無理っぽい と想定していました。 しかし、静的SQLでテーブル名の変数指定が不可能 という情報が得られなかったため、 「もしかすると、何らかの方法があるかも」と思い、有識者に質問させていただいた次第です。 今回質問させていただいたのは、既存のプログラムに以下のような変更を入れるためです。 <現行> 一つのテーブルを対象に処理 ↓ <変更> レコード構造が同じテーブルを追加。 ケースにより対象テーブルを選択して処理。 一からプログラムを書くのであれば、迷わず動的SQLを使用するのですが、静的SQLで 書かれた既存のプログラムの改造の場合、修正量の少ない方法を選択すべきと思いました。 テーブル名だけ変更できればOKなので、何か良い方法はないものかと思ったのですが、 やはり無理でしたか。 勉強になりました。どうもありがとうございました。 | ||||
|
投稿日時: 2007-07-12 11:39
「方法4」は必要ないでしょう。
↓こんな感じで良いのでは? char sql[適切なsize]; if ( table_typ == 1 ) { strcpy( sql ,"UPDATE test_tbl_01 set 〜 where 〜 "); } else { strcpy( sql ,"UPDATE test_tbl_99 set 〜 where 〜 "); } EXEC SQL PREPARE s1 FROM :sql; EXEC SQL EXECUTE s1 ; /* host変数があるならUSING句を追加 */ 上記では、sqlの編集の仕方は単純化してます。 | ||||
|
投稿日時: 2007-07-12 22:10
未記入様
ご回答ありがとうございます。 動的SQLを使用すれば、対象テーブルを可変に指定可能なことは存じております。 しかし、既存のプログラムの実装があまり良くなく、静的SQLを動的SQLに単純に 置き換えることが困難な状況なのです。 不可能ではないですが、時間的余裕のない中では、リスクも高くなりそうな感じです。 残念ながら、今回は、リスク回避のため、動的SQLへの変更はあきらめました。 | ||||
|
投稿日時: 2007-07-13 09:11
結論を出されたようですので、以下は余談ですが。
host変数を使わなくて済む「方法1」が使えるなら、SQL文編集後に EXEC SQL EXECUTE IMMEDIATE :SQL文; で、似たような感じで改造できそうかなと思いました。 |
1