質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Q&A

解決済

2回答

4096閲覧

OracleのFunction(PL/SQL)のsqlplusからの呼び出し方法の確認

ad.sys.soleil

総合スコア28

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

0グッド

0クリップ

投稿2020/07/01 02:13

編集2020/07/01 05:08

下記コマンドにてFunctionを呼び出して成功しています。
SQL> variable PO_ERR_MSG varchar2(10);
SQL> execute :ret := FUNC_TEST('20200701','0000','9999',:PO_ERR_MSG);
SQL> print ret PO_ERR_MSG;

下記の様にSELCT文でずっと試験していましたが、上手く行かずexecuteを使った次第です。
function側はPO_ERR_MSGはOUTで定義しております。
元々OUT定義した場合にはSELECTは使えないものでしょうか。
SQL> SELECT FUNC_TEST('20200701','0000','9999',:PO_ERR_MSG) FROM DUAL;
行1でエラーが発生しました。:
ORA-06572: ファンクションFUNC_TESTに出力引数が指定されています
ご存じの方居りましたら宜しくお願い致します。

エラー履歴下記。
SQL> SELECT FUNC_TEST('20200701','0000','9999',:PO_ERR_MSG) FROM DUAL;
SELECT FUNC_TEST('20200701','0000','9999',:PO_ERR_MSG) FROM DUAL
行1でエラーが発生しました。:
ORA-06572: ファンクションFUNC_TESTに出力引数が指定されています
'--------------------------------------------------------------
Creat Function下記

PL/SQL

1CREATE OR REPLACE FUNCTION ATOMBC.FUNC_TEST 2( 3--パラメタ 4 PI_EXECYMD IN VARCHAR2, --実行年月日(YYYYMMDD):任意 5 PI_TERMSCD_FROM IN VARCHAR2, --FROM条件コード:任意 6 PI_TERMSCD_TO IN VARCHAR2, --TO条件コード:任意 7 PO_ERR_MSG OUT VARCHAR2 --エラーメッセージ:異常終了時のORACLEエラー内容 8) 9--戻り値:正常=0/異常終了=-1 10RETURN NUMBER 11IS 12--*************************************************************************** 13--** 変数定義 14--*************************************************************************** 15W_EXECYMD VARCHAR2(8) := TO_CHAR(SYSDATE,'YYYYMMDD'); --初期値:サーバー日付なYYYYMMDD 16W_TERMSCD_FROM VARCHAR2(5) := '00000'; --初期値:FROM条件「00000」 17W_TERMSCD_TO VARCHAR2(5) := '99999'; --初期値:TO条件「99999」 18BEGIN 19--************************************************************ 20--パラメタを変数セット 21IF PI_EXECYMD IS NOT NULL THEN 22 W_EXECYMD := PI_EXECYMD; 23END IF; 24IF PI_TERMSCD_FROM IS NOT NULL THEN 25 W_TERMSCD_FROM := PI_TERMSCD_FROM; 26END IF; 27IF PI_TERMSCD_TO IS NOT NULL THEN 28 W_TERMSCD_TO := PI_TERMSCD_TO; 29END IF; 30 31--処理 32PO_ERR_MSG := 'Nomal'; 33 34--正常戻り値:0 35RETURN 0; 36 37EXCEPTION 38 --予期せぬエラー 39 WHEN OTHERS THEN 40 DBMS_OUTPUT.PUT_LINE(SQLCODE || ':' || SQLERRM(SQLCODE)); 41 PO_ERR_MSG := SQLCODE || ':' || SQLERRM(SQLCODE); 42 --異常終了戻り値:-1 43 RETURN -1; 44END; 45/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2020/07/01 04:17

[PL/SQL]タグを追加してください。
Orlofsky

2020/07/01 05:01

無駄ですから、キャプチャは削ってください。
guest

回答2

0

ベストアンサー

SQLでは PL/SQLのOUT パラメータを使えません。
見易さを考えて字下げをするのは初歩中の初歩です。

SQL

1SQL> CREATE OR REPLACE FUNCTION FUNC_TEST 2 2 ( 3 3 -- パラメタ 4 4 PI_EXECYMD IN VARCHAR2, -- 実行年月日(YYYYMMDD):任意 5 5 PI_TERMSCD_FROM IN VARCHAR2, -- FROM条件コード:任意 6 6 PI_TERMSCD_TO IN VARCHAR2, -- TO条件コード:任意 7 7 PO_ERR_MSG OUT VARCHAR2 -- エラーメッセージ:異常終了時のORACLEエラー内容 8 8 ) 9 9 -- 戻り値:正常=0/異常終了=-1 10 10 RETURN NUMBER 11 11 IS 12 12 -- 変数定義 13 13 W_EXECYMD VARCHAR2(8) := TO_CHAR(SYSDATE,'YYYYMMDD'); -- 初期値:サーバー日付なYYYYMMDD 14 14 W_TERMSCD_FROM VARCHAR2(5) := '00000'; --初期値:FROM条件「00000」 15 15 W_TERMSCD_TO VARCHAR2(5) := '99999'; --初期値:TO条件「99999」 16 16 BEGIN 17 17 --パラメタを変数セット 18 18 IF PI_EXECYMD IS NOT NULL THEN 19 19 W_EXECYMD := PI_EXECYMD; 20 20 END IF; 21 21 IF PI_TERMSCD_FROM IS NOT NULL THEN 22 22 W_TERMSCD_FROM := PI_TERMSCD_FROM; 23 23 END IF; 24 24 IF PI_TERMSCD_TO IS NOT NULL THEN 25 25 W_TERMSCD_TO := PI_TERMSCD_TO; 26 26 END IF; 27 27 28 28 PO_ERR_MSG := 'Nomal'; -- 処理 29 29 30 30 RETURN 0; -- 正常 31 31 32 32 EXCEPTION 33 33 -- 予期せぬエラー 34 34 WHEN OTHERS THEN 35 35 DBMS_OUTPUT.PUT_LINE(SQLERRM); 36 36 PO_ERR_MSG := SQLERRM(SQLCODE); 37 37 RETURN -1; -- 異常終了 38 38 END FUNC_TEST; 39 39 / 40 41ファンクションが作成されました。

今回はPL/SQLの無名ブロックからFUNCTION を呼びました。

SQL

1SQL> SET SERVEROUTPUT ON 2SQL> DECLARE 3 2 W_ERR_MSG VARCHAR2(1024) ; 4 3 BEGIN 5 4 IF FUNC_TEST('20200701','0000','9999', W_ERR_MSG) = -1 THEN 6 5 DBMS_OUTPUT.PUT_LINE('ERROR IN FUNC_TEST ' || W_ERR_MSG) ; 7 6 ELSE 8 7 DBMS_OUTPUT.PUT_LINE('FUNC_TEST OK') ; 9 8 END IF ; 10 9 END ; 11 10 / 12FUNC_TEST OK 13 14PL/SQLプロシージャが正常に完了しました。 15 16SQL>

マニュアルを確認しておきましょう。

投稿2020/07/01 05:23

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ad.sys.soleil

2020/07/01 06:13

ご回答有難う御座います。
guest

0

元々OUT定義した場合にはSELECTは使えないものでしょうか。

select 文では、OUTで受け取るものを定義できないから無理だと思います。
複数の結果を受け取りたいなら、テーブルファンクションでしょうね。

投稿2020/07/01 02:35

編集2020/07/01 04:05
sazi

総合スコア25085

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ad.sys.soleil

2020/07/01 03:09

ご回答有難う御座います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問