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も見ています
-
賃貸で可能な古民家風レトロな部屋作りのコツ!改めて知る畳の高い機能性と魅力も紹介
畳の部屋を雰囲気のよい部屋に仕上げたい!賃貸住宅でもできる古民家風のレトロな部屋作りのコツを伺った。
-
【PL/SQL】FROM区に変数を使う方法
Oracle
-
テーブル名が可変の場合のクエリの書き方
MySQL
-
PL/SQLでテーブル名に変数を使いたい
その他(データベース)
-
-
4
テーブルの存在チェックについて
Oracle
-
5
変数が選択リストにありません
Oracle
-
6
SQLで列名を変数にできないでしょうか
SQL Server
-
7
PL/SQLでFROM句に変数を使いたい
その他(データベース)
-
8
プロシージャで変数をテーブル名として使用したい
SQL Server
-
9
sqlplusのspoolで空白行出現
Oracle
-
10
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
新宿、池袋付近でお勧めの焼き...
-
CPRM decrypterのエラーコード...
-
マクロをCallする方法を教えて...
-
IDとパスワードについて。
-
selectの単純繰り返し
-
Accessの構成をコピーしたい
-
データベース ユーザの「このユ...
-
SELECTした結果に行番号を求めたい
-
truncate tableを使って複数の...
-
PostgreSQLのUPDATE文につきまして
-
【エクセル/excel】if関数とフラグ
-
sqlite select 表示されない
-
PHP+SQL在庫集計で在庫の累計が...
-
ストアドプロシジャーでDBの自...
-
SELECTした結果をSELECTしたい!
-
MySQL: 複数テーブルのcount
-
フラグをたてるってどういうこ...
-
SELECT文で足し算をした場合、N...
-
現在、VBAにてUNICODEのCSVを出...
-
ご覧ください、ご参照ください...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー:2517 プロシージ...
-
CPRM decrypterのエラーコード...
-
テーブル名が可変の動的SQLをフ...
-
オシロスコープYOKOGAWA DL708...
-
Activation codeとは
-
PostgreSQL : 多値従属性(第四...
-
B4サイズは?mmx?mmですか?
-
SQLでTableが作れないlol
-
SQL文で質問があります。
-
自己結合による新しいカラムの作成
-
新宿、池袋付近でお勧めの焼き...
-
Oracl[10g]の SQL文について(No.8)
-
★★PL/SQLにてTBL内容をCS...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
スキーマ
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
Accessで今日から5日後
おすすめ情報