- PR -

Pro*Cでのテーブル名指定

1
投稿者投稿内容
IanBrown
会議室デビュー日: 2003/10/17
投稿数: 8
投稿日時: 2007-07-10 21:08
Oracle Pro*Cの初心者です。
書籍やインターネットで調べたのですが、いまひとつ良い情報が
見つけられませんでした。
そこで、有識者のご意見をお伺いしたく、質問させていただきます。

Pro*Cの静的SQLを使用する際、テーブル名をホスト変数に設定して
指定することは可能なのでしょうか?

例えば、以下のような感じです。
# 途中省略で、ポイントだけです。

コード:
/* ホスト変数の宣言 */
EXEC SQL BEGIN DECLARE SECTION;
    char target_table[20];	/* 処理対象テーブル名 */
        :
        :
EXEC SQL END DECLARE SECTION;


/* テーブル種別により対象テーブルを決定 */
/*  (各テーブルのレコード構造は同一 )*/
if ( table_typ == 1 ) {
	strcpy( target_table ,"test_tbl_01");
}
else{
	strcpy( target_table ,"test_tbl_99");
}

/* データ更新 */
EXEC SQL UPDATE :target_table set 〜 where 〜 ;
        /* ↑この指定は可能? */

/* データ削除 */
EXEC SQL DELETE FROM :target_table where 〜 ;
            /* ↑この指定は可能? */



コンパイルして試せれば良いのですが、現在は、
Pro*Cのコンパイル環境が使用可能な状態にないため、
机上で悩んでいます。

以上、よろしくお願いいたします。
片桐 継
会議室デビュー日: 2007/05/16
投稿数: 14
お住まい・勤務地: 東京
投稿日時: 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 ]
IanBrown
会議室デビュー日: 2003/10/17
投稿数: 8
投稿日時: 2007-07-10 22:52
片桐様

ご回答ありがとうございます。
やはり、静的SQLでテーブル名を動的に指定するのは無理なのですね。

"動的SQL"は、存じております。
動的SQLの説明に"テーブル名、カラム名を動的に指定可能"というようなことが書いて
ありました。
動的SQLの存在意義を考えると、静的SQLでテーブル名を変数で指定するのは無理っぽい
と想定していました。
しかし、静的SQLでテーブル名の変数指定が不可能 という情報が得られなかったため、
「もしかすると、何らかの方法があるかも」と思い、有識者に質問させていただいた次第です。

今回質問させていただいたのは、既存のプログラムに以下のような変更を入れるためです。
<現行> 一つのテーブルを対象に処理

<変更> レコード構造が同じテーブルを追加。
ケースにより対象テーブルを選択して処理。

一からプログラムを書くのであれば、迷わず動的SQLを使用するのですが、静的SQLで
書かれた既存のプログラムの改造の場合、修正量の少ない方法を選択すべきと思いました。
テーブル名だけ変更できればOKなので、何か良い方法はないものかと思ったのですが、
やはり無理でしたか。

勉強になりました。どうもありがとうございました。
未記入
会議室デビュー日: 2007/07/12
投稿数: 18
投稿日時: 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の編集の仕方は単純化してます。
IanBrown
会議室デビュー日: 2003/10/17
投稿数: 8
投稿日時: 2007-07-12 22:10
未記入様

ご回答ありがとうございます。

動的SQLを使用すれば、対象テーブルを可変に指定可能なことは存じております。

しかし、既存のプログラムの実装があまり良くなく、静的SQLを動的SQLに単純に
置き換えることが困難な状況なのです。
不可能ではないですが、時間的余裕のない中では、リスクも高くなりそうな感じです。

残念ながら、今回は、リスク回避のため、動的SQLへの変更はあきらめました。
未記入
会議室デビュー日: 2007/07/12
投稿数: 18
投稿日時: 2007-07-13 09:11
結論を出されたようですので、以下は余談ですが。

host変数を使わなくて済む「方法1」が使えるなら、SQL文編集後に

EXEC SQL EXECUTE IMMEDIATE :SQL文;

で、似たような感じで改造できそうかなと思いました。
1

スキルアップ/キャリアアップ(JOB@IT)