2016-07-08 3 views
1

Мое понимание есть 2 способа возвращения retult из процедуры или функции,разница между из параметров и возвращаемого значения в PL/SQL

  1. OUT Тип параметра: используется для получения значений из процедур и функции

  2. возвращаемое значение из функции,

Мой вопрос,

  1. Какая разница между параметром OUT и возвращаемым значением в функции?

  2. Если у меня есть параметр OUT в функции, значит ли это, что у меня может получиться 2 результата?

+0

Ответ на второй вопрос: ДА. Первый вопрос - очень важная тема, чтобы знать сходства и различия, пожалуйста, изучите документацию здесь: 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. Аналогично FUNCTION без параметра OUT можно вызвать в SQL.

2) Вы можете использовать OUT, а также тип RETURN для получения значений из FUNCTION, но тип возвращаемого значения остается только ОДНОМ.

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) 

Если нужно вернуть два или несколько связанных значений, вы можете создать SQL объекта PL/и вернуть его в функцию, и он может быть использован с простой SQL тоже!

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

Функции также могут быть вне параметров, но такие функции, как процедуры, не могут быть вызваны из SQL-запросов.

Если код действительно не должен вызываться из SQL-запроса, и вам нравится возвращать не связанные значения или значения, которые не являются основной целью этого кода, процедура может быть хорошим выбором.

Не всегда у вас есть «правильный» выбор, более похожий на вопрос о стиле программирования.

Смежные вопросы