
Oracle9iのWindowsXP環境です。
以下のようなPL/SQLを作成しましたが、同じようなselect文の繰り返しなので整理したいのと、レスポンスが悪いのでファンクションにしたいのですが、テーブル名が可変のため上手くいきません。「Table&1」は置換変数で、batファイルからパラメータが渡り、「Table200812」のように変更されます。
【***.bat】
set /p phara
sqlplus -s ***/***@*** ***.sql %phara%
【***.sql】
省略
begin
select aaa into a1 from Table&1 where code = 'AAAAA';
・・
select aaa into a2 from Table&1 where code = 'BBBBB';
・・
select aaa into a3 from Table&1 where code = 'CCCCC';
・・
省略
end;
/
以下、試しに作成しようとしたファンクションですが、やはり予想どおりですが「表がありません」とコンパイルエラーになります。
create function Func_test(code IN varchar2, Table1 IN varchar2) return number is
ret number;
begin
select aaa into ret from Table1 where code = 'code';
return ret;
end;
/
※コール側は、「a1 = Func_Test('AAAAA', Table&1);」
そもそもこれが実現できたとしてレスポンスが上がるものなのでしょうか?どちらにせよコードを整理する意味でもファンクションにはしたいのですが。。
宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
#1です。
>要はテーブル名が可変なファンクション
結局それを実現するのが、「EXECUTE IMMEDIATE」か「DBMS_SQL」を使う、と言う事になると思います。
>同じようなSELECT文が実際のコード上では20回以上
これを動的SQLでまとめたとしても、実際は違うSQL(テーブルが違うなら間違いなく違うSQLです)を発行しているので、その点では、ストアド化でパフォーマンスが大きく改善する事はないと思います。
動的SQLの場合、解析の時間も余計に食いますし。
解析の時間を減らす、と言う意味では、パラメータは、code, Table1のままにして、動的SQLではなくロジックでELSIFで冗長に判断する方がいいでしょうね。
それよりも、1つ1つの実行計画が良好なものであるなら、20発くらいの連投はパフォーマンスに大きな影響はないはずですよ。バッチ処理ならなおさらです。
ご回答ありがとうございます。
>>結局それを実現するのが、「EXECUTE IMMEDIATE」か「DBMS_SQL」を使う、と言う事になると思います。
EXECUTE IMMEDIATE ('SELECT *** FROM') || YYMM WHERE *** ;
ということでしょうか?
確かにコンパイルは通ると思うのですが、これで結果は正しく返ってきましたでしょうか?ちょっと今試せる環境がないのですが・・
>これを動的SQLでまとめたとしても、実際は違うSQL(テーブルが違うなら間違いなく違うSQLです)を発行しているので、その点では、ストアド化でパフォーマンスが大きく改善する事はないと思います。
動的SQLの場合、解析の時間も余計に食いますし。
なるほど。。やはりそうですよね。。
No.1
- 回答日時:
そもそも、このファンクションは動的SQLになっていないですね。
ORACLEの動的SQLと言えば、「EXECUTE IMMEDIATE」か「DBMS_SQL」です。
(リンク参照ください)
で、レスポンスですが、そもそも実行計画(プラン)は見ていますか?
トレースを取ってみて、FULL SCAN や Disk Read が多発しているようなら、INDEXを張るとか、条件を見直すとかが必要になると思います。
参考URL:http://www.shift-the-oracle.com/plsql/native-dyn …
ご回答ありがとうございます!
まず、「動的SQL」という表現が良くなかったかもわかりません。要はテーブル名が可変なファンクションを作成したいだけなのです。
実行計画はまだ見ていませんが、そもそも同じようなSELECT文が実際のコード上では20回以上も発行されていますので、それをストアド化してレスポンスが下げられないものなのかなぁと思ってみたのです。
言葉足らずであったり、表現がまぎらわしくて申し訳ありませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー:2517 プロシージ...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
エラーを起こす方法
-
SQLサーバに対するSQL文で抽出...
-
テーブル名が可変の場合のクエ...
-
truncate tableを使って複数の...
-
エクセルvbaでpostgresに接続を...
-
PostgreSQLのtimestamp型で時間...
-
テーブル定義書(Oracle) 【IX】...
-
chr(13) と char(13) の違いっ...
-
2つのテーブルをLIKE演算子のよ...
-
Accessの構成をコピーしたい
-
T-SQLで任意の箇所で強制終了す...
-
全テーブルの列数を調査したい
-
SQLSERVER 連番更新について
-
同一テーブル内での比較(最新...
-
SQLで、過去で一番大きい日付の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー:2517 プロシージ...
-
テーブル名が可変の動的SQLをフ...
-
CPRM decrypterのエラーコード...
-
SQL文の実行速度について
-
翻訳お願いします 日→英
-
Oracl[10g]の SQL文について(No.8)
-
PostgreSQL : 多値従属性(第四...
-
オラクルDBでの不一致の検索
-
B4サイズは?mmx?mmですか?
-
マクロをCallする方法を教えて...
-
自己結合による新しいカラムの作成
-
★★PL/SQLにてTBL内容をCS...
-
複数検索について
-
オシロスコープYOKOGAWA DL708...
-
selectの書き方を教えてください
-
GROUP BY と DISTINCT
-
SQL文で質問があります。
-
SQL スクリプトの質問
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
おすすめ情報