違い

2016-07-08 3 views
1

私の理解では、プロシージャまたは関数からretultを返すの2つの方法、違い

  1. OUTタイプのパラメータがあります:これは手続きから値を取得するために使用され、機能

  2. 関数からの戻り値

私の質問があり、

  1. OUTパラメータと関数の戻り値の違いは何ですか?

  2. 関数にOUTパラメータがある場合、2つの「返された」結果を持つことができますか?

+0

2番目の質問に対する答えは:はいです。最初の質問は非常に巨大なトピックです。類似点と相違点を知るには、ここでドキュメントを調べてください。https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/subprograms.htm#i4074 – krokodilko

+0

どのような違いがありますかあなたは考えていますか?明らかに、関数は 'upper( 'x')'のようなもので、プロシージャは 'dbms_output.put_line( 'x')'のようなものなので、主な違いはセマンティクスです。参照渡し、SQLの呼び出しなどの詳細があります。 –

答えて

0

はい、非常に巨大なトピックを提案しましたが、私はいくつかの違いを示唆することができます。それが役に立てば幸い。

回答:

1)はい機能は、複数のOUT、INを持つことができるのparamsが、戻り値の型は一定となります。そのため、関数内にOUT PARAMがある場合、SQLで呼び出すことはできません。同様に、OUT paramのないFUNCTIONをSQLで呼び出すことができます。

2)OUT型とRETURN型を使用してFUNCTIONから値を取得することはできますが、依然として戻り型は1つのみです。

CREATE OR REPLACE FUNCTION FUNCT_TEST 
(
p_in IN NUMBER, 
p_out OUT NUMBER 
) 
RETURN VARCHAR2 
AS 
BEGIN 
p_out:=10; 
RETURN 'AVRAJIT'; 
END; 


SELECT FUNCT_TEST(1) FROM DUAL; 

ORA-06553: PLS-306: wrong number or types of arguments in call to 'FUNCT_TEST' 

CREATE OR REPLACE FUNCTION FUNCT_TEST 
(
p_in IN NUMBER 
) 
RETURN VARCHAR2 
AS 
BEGIN 
--p_out:=10; 
RETURN 'AVRAJIT'; 
END; 

SELECT FUNCT_TEST(1) FROM DUAL; 

FUNCT_TEST(1) 
AVRAJIT 
1

出力パラメータを持たない関数から返された値は、SQLクエリ(select文またはdml文内)から使用できます。シンプルなプリミティブ型を返すコードがあれば、私は関数にお勧めします。

SELECT * FROM PAYMENTS WHERE DATE = LAST_DAY_OF_MONTH(SYSDATE) 

あなたが二つ以上の関連する値を返す必要がある場合は、PL/SQLオブジェクトを作成し、関数内でそれを返す、それはあまりにも普通のSQLから使用することができますすることができます!

SELECT RESP.CODE, RESP.BODY FROM (SELECT GET_HTTP_RESP(URL) FROM DUAL) RESP; 

関数はパラメータも出力できますが、プロシージャのような関数はSQLクエリから呼び出すことはできません。

コードが実際にSQLクエリから呼び出されることは想定されておらず、そのコードの主な目的ではない関連する値や値が返されたくない場合は、プロシージャを選択するとよいでしょう。

「正しい」選択肢は必ずしもありません。プログラミングスタイルの質問によく似ています。