- PR -

DBからファンクション名を取得して、そのファンクションを実行できますか?(PL/SQL)

1
投稿者投稿内容
すひろ
大ベテラン
会議室デビュー日: 2006/10/17
投稿数: 124
お住まい・勤務地: 愛知県
投稿日時: 2009-01-08 22:37
お世話になっております。

PL/SQLについて教えていただきたいことがあります。

『1』
DBからファンクション名をVARCHAR型で取得して、その値を使って直接ファンクションを実行することはできますか?
 select funcname into wk_func from ..... -- SQL検索
wk_return := PACKAGE1.wk_func(引数1); -- wk_func名のファンクション実行

上記のようなことをイメージしています。
funcname項目に入っているファンクションの引数はすべて同じと想定しています。

『2』
group by句を使うことで検索結果が1件になるSQLでも、
select-intoではなくカーソルを使わないといけないのでしょうか?

u_id s_cd
100 7
200 8
200 8
300 9

select u_id,s_cd from xx group by u_id, s_cd

上記のような場合、グループ化すると取得できるのは1件だけになりますが、
それをselect-intoで実行させたら「複数件取得できた」というエラーが出てしまいました。
カーソルを使えば解決するのですが、
1件だけしか取得しないのにカーソルを使うのは効率が悪い気がします。

以上2点、どなたかご存じの方、アドバイスいただけたら幸いです。


[ メッセージ編集済み 編集者: みゅう 編集日時 2009-01-09 00:12 ]
無名tiger
常連さん
会議室デビュー日: 2008/04/18
投稿数: 36
投稿日時: 2009-01-09 00:31
引用:

『1』
DBからファンクション名をVARCHAR型で取得して、その値を使って直接ファンクションを実行することはできますか?
 select funcname into wk_func from ..... -- SQL検索
wk_return := PACKAGE1.wk_func(引数1); -- wk_func名のファンクション実行

上記のようなことをイメージしています。
funcname項目に入っているファンクションの引数はすべて同じと想定しています。



execute immediate で試してください。
※検証しません。

引用:

『2』
group by句を使うことで検索結果が1件になるSQLでも、
select-intoではなくカーソルを使わないといけないのでしょうか?

u_id s_cd
100 7
200 8
200 8
300 9

select u_id,s_cd from xx group by u_id, s_cd

上記のような場合、グループ化すると取得できるのは1件だけになりますが、



1件だけ?4件じゃないですか?

_________________
カスタマイズ自由自在のスタートページ。
すひろ
大ベテラン
会議室デビュー日: 2006/10/17
投稿数: 124
お住まい・勤務地: 愛知県
投稿日時: 2009-01-09 00:40
無名tigerさん、ありがとうございます。

>execute immediate で試してください。
調べてみたいと思います。

>1件だけ?4件じゃないですか?
select u_id,s_cd from xx where u_id = '200' group by u_id, s_cd
の間違いでした。
グループ化することでn件を集約して1件として取得出来るとき、
カーソルを使わずに取得できるか、という質問になります。

わかりにくい書き方ですみません。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-01-09 01:06
本当に1件しか取得されない SQL が発行されているのでしょうか。
「複数件取得できた」というエラーが出ているんだから
複数件取得出来ているんじゃないですか?

実際にそのエラーが出ているのは

引用:
u_id s_cd
100 7
200 8
200 8
300 9


の4件のレコードに対して

コード:
select u_id,s_cd into AAA, BBB from xx where u_id = '200' group by u_id, s_cd


という事で間違いないですか?
レコード内容、レコード数、実行している SELECT 文に相違ないですか?
すひろ
大ベテラン
会議室デビュー日: 2006/10/17
投稿数: 124
お住まい・勤務地: 愛知県
投稿日時: 2009-01-10 00:34
Kingさん、ありがとうございます。

>execute immediate
実際に試してみたのですが、「SQL文が無効です。」エラーが発生しました。
自分なりに調べてみたのですが、この命令は動的SQLを実行するためのものである気がします。
ファンクションやプロシージャの実行にも使えるのでしょうか?

 select funcname into wk_func from ..... -- SQL検索
 str1 := 'PACKAGE1.' || wk_func || '(引数1)';
 execute immediate str1;

>レコード内容、レコード数、実行している SELECT 文に相違ないですか?
実際のデータはこちらに書いたものとは違っており、
よく見なおしてみたところ、2件取得していたことがわかりました。
where句を修正して、グループ化したら1件になるようにしたら、select-intoでも成功しました。
お騒がせしました。

[ メッセージ編集済み 編集者: みゅう 編集日時 2009-01-10 01:04 ]
やまだ
会議室デビュー日: 2009/01/14
投稿数: 8
投稿日時: 2009-01-14 11:00
execute immediate でファンクションの実行は可能です。
SQLを begin 〜 end; の形式で記述してみてください。(必要であればdeclareから)
以下の様な感じです。
コード:
declare
 str varchar2(100) := 'begin dbms_output.put_line(''hogehoge''); end;';
begin
 execute immediate str;
end;


すひろ
大ベテラン
会議室デビュー日: 2006/10/17
投稿数: 124
お住まい・勤務地: 愛知県
投稿日時: 2009-01-16 01:31
ありがとうございます。
早速試させていただきます。
1

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