- ベストアンサー
引数の渡し方
パッケージ内のプロシージャで 引数を渡し、その引数を検索条件として 使用したいのですが、エラーが出てしまいます。 引数に数値を与えると動くのですが 文字列を与えるとエラーが出ます。 エラーの内容は(引数として与えた文字列)は、 無効な識別子ですと表示されます。 おそらくシングルクォーテーションが 渡っていないのだと思い、||で文字列を 結合してみたのですが、それでも同様の エラーが表示されました。 ex) update TEST set col1 = 'TEST' where col1 = (引数で与えられた値); 正確に申し上げますと、上記のSQL文を hensuu := (上記のSQL文) execute immediately hensuu; として実行しています。 あいまいな表現でわかりにくいかとは 思いますが、ヒントを頂けたらと思い、 質問させていただきました。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
私が、作った年度に変換する関数です。 文字列でやりとりしています。参考にして下さい。 内容は年月日を渡して4月1日より小さい時に年を 引1しています。で戻りは年度4桁を返します。 (20000331-->1999) CREATE OR REPLACE FUNCTION nendo_cnv( inp_ymd IN VARCHAR2 ) RETURN VARCHAR2 IS s_nen CHAR(4); s_tukihi CHAR(4); i_len NUMBER; nendo NUMBER; tukihi NUMBER; BEGIN -- パラメータのチェック IF LENGTH(inp_ymd) != 8 THEN nendo := 0; RETURN NULL; END IF; -- 年月日の分解 s_nen := SUBSTR(inp_ymd, 1, 4); s_tukihi := SUBSTR(inp_ymd, 5, 4); nendo := TO_NUMBER(s_nen); tukihi := TO_NUMBER(s_tukihi); IF tukihi < 401 THEN nendo := nendo - 1; END IF; RETURN TO_CHAR(nendo); END nendo_cnv;
その他の回答 (1)
- ossan_hiro
- ベストアンサー率66% (88/132)
たぶんシングルクォーテーションの数じゃないでしょうか? たとえばこんな↓テーブルがあったとして create table hoge (key1 varchar2(10) primary key,name1 varchar2(50)) こんなUpdateするモジュールを作れます。 create or replace function upd_hoge1 (keyval in varchar2 ,modval in varchar2) return number is sqlstmt varchar2(200); begin sqlstmt := 'update hoge set name1=''' || modval || ''' where key1=''' || keyval || ''''; execute immediate sqlstmt; return 0; exception when others then dbms_output.put_line(SQLERRM); return 9; end; ただ、できればexeute immediateを使うのであれば、バインド変数を使って create or replace function upd_hoge2 (keyval in varchar2 ,modval in varchar2) return number is sqlstmt varchar2(200); begin sqlstmt := 'update hoge set name1=:v1 where key1=:v2'; execute immediate sqlstmt using modval,keyval; return 0; exception when others then dbms_output.put_line(SQLERRM); return 9; end; にしたほうがいいかもしれません。
お礼
お礼および締め切りが遅くなり、申し訳ありませんでした。ありがとうございました。