私の理解では、プロシージャまたは関数からretultを返すの2つの方法、違い
OUTタイプのパラメータがあります:これは手続きから値を取得するために使用され、機能
- 関数からの戻り値
、
私の質問があり、
OUTパラメータと関数の戻り値の違いは何ですか?
関数にOUTパラメータがある場合、2つの「返された」結果を持つことができますか?
私の理解では、プロシージャまたは関数からretultを返すの2つの方法、違い
OUTタイプのパラメータがあります:これは手続きから値を取得するために使用され、機能
、
私の質問があり、
OUTパラメータと関数の戻り値の違いは何ですか?
関数にOUTパラメータがある場合、2つの「返された」結果を持つことができますか?
はい、非常に巨大なトピックを提案しましたが、私はいくつかの違いを示唆することができます。それが役に立てば幸い。
回答:
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
出力パラメータを持たない関数から返された値は、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クエリから呼び出されることは想定されておらず、そのコードの主な目的ではない関連する値や値が返されたくない場合は、プロシージャを選択するとよいでしょう。
「正しい」選択肢は必ずしもありません。プログラミングスタイルの質問によく似ています。
2番目の質問に対する答えは:はいです。最初の質問は非常に巨大なトピックです。類似点と相違点を知るには、ここでドキュメントを調べてください。https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/subprograms.htm#i4074 – krokodilko
どのような違いがありますかあなたは考えていますか?明らかに、関数は 'upper( 'x')'のようなもので、プロシージャは 'dbms_output.put_line( 'x')'のようなものなので、主な違いはセマンティクスです。参照渡し、SQLの呼び出しなどの詳細があります。 –