• ベストアンサー
  • すぐに回答を!

PL/SQLでファンクション名に変数を使用するには

PL/SQLでファンクションの呼出を行いたいと思っています。 そこでファンクション名を変数で指定したいと思っているのですがうまくいきません。 ファンクション FUNCTION Check ( pi_Syori_No   IN NUMBER,  -- 処理No. po_Function_Name OUT VARCHAR2  -- ファンクション名 ) RETURN BOOLEAN IS TYPE Test_List IS VARRAY(100) OF VARCHAR2(10) NOT NULL; TYPE FcNameList IS VARRAY(100) OF VARCHAR2(10) NOT NULL; MmsCheckList Test_List := Test_List('○','×'); FcNameCheckList FcNameList := FcNameList('Check','Check'); BEGIN IF MmsCheckList(pi_Syori_No) = '○' THEN po_Function_Name :=FcNameCheckList(pi_Syori_No); ELSE po_Function_Name :=NULL; END IF; RETURN TRUE; EXCEPTION WHEN OTHERS THEN RETURN FALSE; END Check; メイン CREATE OR REPLACE PROCEDURE Test ( po_Out OUT VARCHAR2 ) IS Modoriti BOOLEAN :=TRUE; F_Neme VARCHAR2(2000) :=NULL; BEGIN IF Check(1,F_Neme) = TRUE THEN Modoriti := F_Neme(2,F_Neme); END IF; EXCEPTION WHEN OTHERS THEN po_Out := 'エラー'; END Test; この状態で実行すると下記のエラーが出てしまいます。 [PLS-00222: この有効範囲内に、名前'F_Neme'の関数は存在しません。] ファンクション名に変数を使うのは無理なのでしょうか? よろしくお願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数1571
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2

ファンクションをどのように使いたいのか、質問に明記された方が回答があるかも知れませんよ。 なるべく実例に近づけて。 質問を出しなおしてみては?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご返事が遅くなり申し訳ありません。 assault852様の言われるとおり、ファンクションをどのように使いたいかなどを、しっかり明記していませんでした。 また、自分の中でも明確な使い方がしっかりしておりませんので一度締め切らせていただき、 再度まとまりましたら質問させていただきたいと思います。 本当にありがとうございました。

関連するQ&A

  • ストアドファンクションがうまく作成できない

    SQL Server 2005 にて、 以下のようなストアドファンクションを作成しようとしても、 「メッセージ 156、レベル 15、状態 1、プロシージャ TestKansu、行 30 キーワード 'end' 付近に不適切な構文があります。」 といったエラーメッセージが表示されてしまい、 うまく作成できません。。 文法など、いろいろ調べてみたところ、特に問題なさそうな 感じではあるのですが。。 どこに問題があるのか、どなたかご教授願えないでしょうか? なにとぞ、よろしくお願いいたします。 -------------------------------- use tempdb go -- 呼び出し形式 create function TestKansu ( @Date as datetime, @Type as varchar(1) ) returns @ReturnTable table ( StartDate varchar(8), EndDate varchar(8) ) as begin if @Type is null begin raiserror('正しいtypeを指定してください',-1,-1) end if @Date is null begin SET @Date = getdate() end if @Type = '0' begin insert into @ReturnTable select convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as StartDate, convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as EndDate, end if @Type = '1' begin insert into @ReturnTable select convert(varchar(8), @Date, 112) as StartDate, convert(varchar(8), @Date, 112) as EndDate end return end --------------------------------

  • PL/SQL での判定(分岐?)の仕方を教えてください!

    PL/SQLで、以下の(1)の処理があった場合、 (2)はどのようにすればいいでしょうか? ※(2)は2つのどちらかの場合に処理をするような 判定をしたいのですが "OR" は使えないですよね? (1)個人IDを取得している場合(NULL以外) IF kojin_id NOT NULL THEN BEGIN SELECT KANRI_NO --管理NOを取得 FROM AAA WHERE KOJIN_ID = kojin_id; EXCEPTION WHEN NO_DATA_FOUND zero_check_flg := 1; --(2)で判定する用のチェックフラグ(※(2)の判定で使えるかなと思ったので) END; END IF; (2)個人IDがNULL、または、(1)で管理NOが取得できなかった場合   ↑   ここの判定文が作れません!!!!!

  • ストアドファンクションのエラーについて

    PostgreSQLでストアドファンクションを作成しました。 ファンクションの内容は下記の通りです。 CREATE FUNCTION getRenban (VARCHAR) RETURNS VARCHAR(7) AS ' DECLARE key ALIAS FOR $1; code VARCHAR(7); code2 VARCHAR(2); code5 VARCHAR(5); renban INTEGER; new_code VARCHAR(7); BEGIN SELECT MAX(code) INTO code FROM M_ITEM WHERE flg = TRIM($1); code2 := TRIM($1); IF code IS NULL THEN renban := 1; ELSE SELECT SUBSTR(code, 2) INTO code5; SELECT TO_NUMBER(code5, ''99999'') INTO renban; renban := renban + 1; END IF; code5 := ''''; SELECT TO_CHAR(renban, ''00000'') INTO code5; SELECT code2 || code5 INTO new_code; RETURN new_code; END; ' language 'plpgsql' ; コンソール上で下記のコマンドを実行したらエラーが出力されました。 SELECT getrenban('01'); 出力されたエラーの内容は下記の通りです。 ERROR: value too long for type character varying(5) CONTEXT: PL/pgSQL function "getrenban" line 19 at SQL statement お恥ずかしいですがいくらコードを見てもどこが原因なのかわかりません。 申し訳ありませんがご教授お願いできませんでしょうか。 昨日から悩んでいます。 どうか助けて下さい、宜しくお願いします。

その他の回答 (1)

  • 回答No.1

ちょっと聞いたことがないですね。 なぜ変数的扱いをしなければならなくなったのでしょうか。

共感・感謝の気持ちを伝えよう!

質問者からの補足

早速のご返答ありがとうございます。 なぜ変数的扱いをしなければならなくなったかというと、自分が初心者のため変数しか思いつかなかったからです。 これといって変数的扱にこだわっているわけではないです。 また、色々試していたのですが行き詰まり、今回質問させていただいたしだいです。

関連するQ&A

  • oracle ファンクションの実行

    oracleでファンクションを作成しております。 このファンクションをVisualBasicより実行しているのですが、 以下のエラーが出力される状況です。 ORA-06550: 行1、列8: PLS-00553: キャラクタ・セット名が認識されません。 ORA-06550: 行0、列0: どのように対処すれば良いか分らず、 どなたか分る方がいらっしゃればご教授頂けますと 幸いです。 ★作成したファンクション CREATE OR REPLACE FUNCTION HINODE.H_HND8010U ( p_in_yoyakuid in varchar2) RETURN varchar2 --********************************************************* --* □ プロシージャ名 --* H_HND8010U --********************************************************* IS vSum varchar2(10); BEGIN vSum := p_in_yoyakuid; RETURN vSum; END; /

  • PL/SQLに関して

    PL/SQLに関しての質問です。 1、プロシージャの内部にファンクションをネストするなどということはできるのでしょうか? (内部ファンクションのような感じで) 2、プロシージャからファンクションを呼び出し、ファンクションの戻り値をレコード型変数にした場合、ファンクションでSELECTしたレコード件数が0件であった場合、例外ブロックのWHEN no_data・・・THEN で、RETURN NULLで戻すことはできるでしょうか? (呼び出し側で、レコード型変数にNULLを代入できますか?) 3、ObjectBrowserからストアドプロシージャを実行するとき、引数ありのストアドプロシージャを実行する方法を教えてください。(または参考WEBサイトを教えてください。) いずれも、試す環境が今ないため、ご回答のほどよろしくお願いします。

  • MYSQL ストアドプロシージャの記述方法

    MYSQLのストアドプロシージャについて分からないことがあり質問させて頂きます。 SQLのwhere句の部分を引数によって条件分で変更させたいと考えています。そこでORACLEの場合は変数にいれて最後に明示的にSQLを発行して いたので可能だったのですが、MYSQLの場合はどういった記述になる のかわかりません。やりたいことは下記のような感じです。 ORACLEの場合は procedure prctest(pc out refcur,a in varchar2,b in varchar2) is sqldata varchar2(1000); whereinfo varchar2(1000); begin sqldata := 'select ID , NAME from testTbl '; if (a IS NOT NULL) then   whereinfo := whereinfo || ' acol = a ' ; end if; if (b IS NOT NULL) then   if (whereinfo IS NOT NULL) then  whereinfo := whereinfo || ' and ';   end if;   whereinfo := whereinfo || ' acol = b ' ; end if; if (whereinfo IS NOT NULL) then  sqldata := sqldata || ' where ' || whereinfo ; end if; open pc for sqldata; (ここでSQLが入ったSQLを発行) end prctest; (抜粋) ストアドをあまり使用したことがなく良い説明ではないかも しれませんが、アドバイスの方頂けたらと思います。 よろしくお願いします。

  • PL/SQLで、変数に格納した値が出力できない

    いつもお世話になっております。 現在PL/SQLでコーディングを行っているのですが テーブルA あ い う  テーブルB い   え  テーブルC う   お となっていて、 Aの「い」がBの「い」と一致するものがあれば「え」を出力 Aの「う」がCの「う」と一致するものがあれば「お」を出力 します。最終的に テーブルD あ え お としたいです。 しかしテーブルAでカーソルに設定したものは出るのですが、 それ以外の変数に入れたものが出力されません。 どうしてなのか、また、どうしたらよいか お分かりなる方がいらっしゃいましたら 教えていただけないでしょうか? CREATE OR REPLACE PROCEDURE SYORI1 IS v_cust_id number(10); v_unit_sec number(10); v_price number(10); v_err_no varchar2(3); v_err_msg varchar2(30); /*カーソルの宣言*/ CURSOR c_cur IS SELECT answr_time, disc_time, calling_num, area_id, FROM call_data WHERE bill = '1' AND direction = 'O'; BEGIN FOR c_rec IN c_cur LOOP /*エラーのリセット*/ v_err_no:= '00'; v_err_msg:= 'エラーなし'; /*事業者テーブルからデータを探す*/ BEGIN SELECT cust_id, unit_sec INTO v_cust_id, v_unit_sec FROM m_cust WHERE orig_opn_dgt = c_rec.calling_num AND voi_dat_cls = c_rec.isdn_mode; EXCEPTION WHEN TOO_MANY_ROWS THEN v_err_no := '91'; v_err_msg := '該当する業者が複数見つかりました'; WHEN NO_DATA_FOUND THEN null; END; /*料金テーブルからデータを探す*/ BEGIN SELECT price INTO v_price FROM m_price WHERE cust_id = v_cust_id AND area_id = c_rec.area_id; EXCEPTION WHEN NO_DATA_FOUND THEN v_err_no := '12'; v_err_msg := 'ユニット料金取得エラー'; END; INSERT INTO BILL_DATA( ans_tm, disc_tm, cust_id, area_id, voi_dat_cls, unit_sec, err_no, err_msg) VALUES ( c_rec.answr_time, c_rec.disc_time, v_cust_id,(★) c_rec.area_id, c_rec.isdn_mode, v_unit_sec,(★) v_err_no,(★) v_err_msg(★)); END LOOP; END SYORI1; / となっていて、実行するとPL/SQLプロシージャが正常に完了しました と出ます。しかし(★)の項目は値が入っていません。 それ以外の項目は問題なく出力されました。 カーソルの出力では変数は使えないのでしょうか? 初心者なので全く新しい方法は難しいので 上記のコードに何か付け加えて上手くいけばと考えています。 よろしくお願いいたします。 長くなってしまい申し訳ありません。

  • ファンクション内での円マークについて

    値をカンマ形式で変換するファンクションを作成しています。 ファンクションの内容は下記の通りです。 CREATE FUNCTION Test (DECIMAL) RETURNS VARCHAR(15) AS ' DECLARE arg ALIAS FOR $1; str VARCHAR(16); BEGIN str := ''''; SELECT TRIM(TO_CHAR(arg, ''\\9,999,999,999'')) INTO str; RETURN str; END; ' language 'plpgsql' ; 上記のコマンドを実行したらワーニングが出力されました。 下記が出力したワーニングの内容です。 WARNING: nonstandard use of \\ in a string literal 行 2: ' ^ HINT: Use the escape string syntax for backslashes, e.g., E'\\'. WARNING: nonstandard use of escape in a string literal 行 1: SELECT TRIM(TO_CHAR( $1 , '\9,999,999,999')) ^ HINT: Use the escape string syntax for escapes, e.g., E'\r\n'. QUERY: SELECT TRIM(TO_CHAR( $1 , '\9,999,999,999')) CONTEXT: SQL statement in PL/PgSQL function "test" near line 6 CREATE FUNCTION ※一応、ファンクションは作成できたんですで・・・ ファンクションを実行したらワーニングと結果が出力されました。 SELECT test(10000); 下記が出力したワーニングの内容です。 WARNING: nonstandard use of escape in a string literal 行 1: SELECT TRIM(TO_CHAR( $1 , '\9,999,999,999')) ^ HINT: Use the escape string syntax for escapes, e.g., E'\r\n'. QUERY: SELECT TRIM(TO_CHAR( $1 , '\9,999,999,999')) CONTEXT: PL/pgSQL function "test" line 6 at SQL statement test -------- 10,000 (1 行) 下記のように円マークの箇所にEをつけたりしましたがワーニングが解消する事はできませんでした。多分、私の記述がいけないような気がします。 すみませんがどのように記述すればいいのでしょうか。 ご教授いただけませんでしょうか。 宜しくお願いします。

  • Mysql ストアドファンクション 意図しない結果

    以下の通りストアドファンクションを作成しました。 関数名:fgetLineNew インパラメータ:shop Varchar 8 ※1つだけ。。。 戻り値: Int 11 <ソース> BEGIN DECLARE pline INTEGER(11) DEFAULT NULL; SELECT COUNT(1) INTO pline FROM `hoge` WHERE `SHOP` = shop; IF pline IS NULL THEN SET pline = 10000; END IF; RETURN pline; END 上記のように、作成したストアドファンクションですが、 どんな引数を入れても、戻り値が全ての行(817行)になってしまいます。 以下を参照。 Where区がまったく働いていないのですが、何が原因なのでしょうか。 教えてください。 <ストアドファンクション実行> mysql> select fgetLineNew(1); +----------------+ | fgetLineNew(1) | +----------------+ | 817 | +----------------+ 1 row in set (0.01 sec) mysql> select fgetLineNew(525); +------------------+ | fgetLineNew(525) | +------------------+ | 817 | +------------------+ 1 row in set (0.01 sec) mysql> select fgetLineNew(101); +------------------+ | fgetLineNew(101) | +------------------+ | 817 | +------------------+ 1 row in set (0.00 sec) mysql> select fgetLineNew(525); +------------------+ | fgetLineNew(525) | +------------------+ | 817 | +------------------+ 1 row in set (0.00 sec) mysql> select fgetLineNew('525'); +--------------------+ | fgetLineNew('525') | +--------------------+ | 817 | +--------------------+ 1 row in set (0.01 sec)

    • ベストアンサー
    • MySQL
  • [Oracle9i]PL/SQLでFETCHしても、%FOUND=TRUEにならない

    簡単なことだと思うのですが、はまってしまったので質問させてください。 以下のようなコードがあります。PL/SQLで書いてます。 SELECTした内容をFETCHして、IF文の%FOUNDで処理内容を変えているのですが、%FOUND=FALSEで必ず返ってきています。SELECT文自体でデータはひっぱって来ている(別で流しました)ようなので、理由が全然わからずまいってます。 -------------------------------------------------- FUNCTION get_siten_cd(siten_cd varchar2) RETURN varchar2 IS ret_siten_cd varchar(4); --4桁支店コード /*カーソル定義*/ CURSOR cs is SELECT SITEN_CD FROM MEI1.SITEN_MST WHERE SITEN_CD3 = siten_cd; /**カーソルに基づくレコードの定義**/ rs cs%ROWTYPE; BEGIN OPEN cs; FETCH cs INTO rs; IF cs%FOUND THEN --データが存在する場合 ret_siten_cd := rs.SITEN_CD; ELSE --データが存在しない場合 ret_siten_cd := NULL; END IF; CLOSE cs; RETURN ret_siten_cd; END; -------------------------------------------------- よろしくお願いします。

  • テーブル名が可変の動的SQLをファンクションにしたい

    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);」 そもそもこれが実現できたとしてレスポンスが上がるものなのでしょうか?どちらにせよコードを整理する意味でもファンクションにはしたいのですが。。 宜しくお願い致します。

  • エクセル VBA for文について

    再び失礼します。 昨日VBAを始めた初心者です。 1、チェックボタン17個にそれぞれ変数を設定 2、2つだけチェックを入れると仮定して、実行ボタンを押したときに チェックが入っている2つの中で変数の大きいものをMax、小さいものをMinとしてシートに出力したいのですが、”ここ”と書いてあるところに Me("hensuu" & n). hensuu & n など入れてみたのですがエラーになります。 くだらないミスだと思いますがよくわかりません。 どなたかご教授お願いします。 Private Sub CommandButton2_Click() If Check1.Value = True Then hensuu1 = "9" End If If Check2.Value = True Then hensuu2 = "8" End If If Check3.Value = True Then hensuu3 = "7" End If If Check4.Value = True Then hensuu4 = "6" End If If Check5.Value = True Then hensuu5 = "5" End If If Check6.Value = True Then hensuu6 = "4" End If If Check7.Value = True Then hensuu7 = "3" End If If Check8.Value = True Then hensuu8 = "2" End If If Check9.Value = True Then hensuu9 = "1" End If If Check11.Value = True Then hensuu10 = "1/2" End If If Check11.Value = True Then hensuu11 = "1/3" End If If Check12.Value = True Then hensuu12 = "1/4" End If If Check13.Value = True Then hensuu13 = "1/5" End If If Check14.Value = True Then hensuu14 = "1/6" End If If Check15.Value = True Then hensuu15 = "1/7" End If If Check16.Value = True Then hensuu16 = "1/8" End If If Check14.Value = True Then hensuu17 = "1/9" End If Dim n As Long Dim Max As Long Dim Min As Long For n = 1 To 17 If Me("Check" & n).Value = True Then Max = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n For n = Max To 17 If Me("Check" & n).Value = True Then Min = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n Worksheets("Sheet1").Range("A1") = Min Worksheets("Sheet1").Range("B1") = Max MsgBox hensuu End Sub

  • collection型を引数にしたファンクションでコンパイルエラー

    件名の通り、collection型を引数にしたファンクション・サブプロシージャを作成して実行しようとすると「コンパイルエラー:引数は省略できません」が出力されます。 ファンクションの引数を Private Function Test(ByRef coltest As Collection) MsgBox ("Test") End Sub のように参照渡しにしても同様の結果となります。 ネットで検索してみましたが、解決策になる回答がみつかりませんでした。 collection型に限らない現象かも知れませんが、どなたか解決策をご存知の方がいらっしゃいましたらご教授願えないでしょうか。 <動作環境> バージョン:access2003 OS:Windows XP professional sp2