Что ж давайте покончим с этими параметрами. Осталось рассмотреть тип применения параметров при передаче их в процедуру. Рассмотрим пример. Создадим процедуру следующего вида:
CREATE OR REPLACE PROCEDURE TEST_POZ( PR_A IN NUMBER, PR_B IN NUMBER, PR_C IN VARCHAR2, PR_D IN VARCHAR2 ) IS BEGIN NULL; END TEST_POZ; /
Ничего особенного она проделывать не будет, но зато с явным энтузиазмом будет принимать аж четыре параметра! Компилируем:
SQL> CREATE OR REPLACE PROCEDURE TEST_POZ( 2 PR_A IN NUMBER, 3 PR_B IN NUMBER, 4 PR_C IN VARCHAR2, 5 PR_D IN VARCHAR2 6 ) 7 IS 8 9 BEGIN 10 11 NULL; 12 13 END TEST_POZ; 14 / Процедура создана.
Все прошло успешно, вот и славно! А вот теперь запишем такой анонимный блок:
SET SERVEROUTPUT ON DECLARE PR_1 NUMBER; PR_2 NUMBER; PR_3 VARCHAR2(100); PR_4 VARCHAR2(100); BEGIN TEST_POZ(PR_1, PR_2, PR_3, PR_4); END; /
Запускаем и получаем:
SQL> SET SERVEROUTPUT ON SQL> SQL> DECLARE 2 3 PR_1 NUMBER; 4 PR_2 NUMBER; 5 PR_3 VARCHAR2(100); 6 PR_4 VARCHAR2(100); 7 8 BEGIN 9 10 TEST_POZ(PR_1, PR_2, PR_3, PR_4); 11 12 END; 13 / Процедура PL/SQL успешно завершена.
Смотрите, мы объявили четыре параметра и передали их нашей функции, в данном конкретном случае мы применили так называемое - "позиционное представление" (positional notation)! Такой тип передачи параметров применяется во всех языках программирования, например в таком как C и C++! Я сразу рекомендую вам пользоваться именно таким способом передачи! Хотя это еще далеко не все!
Запишем следующий анонимный блок:
SET SERVEROUTPUT ON DECLARE PR_1 NUMBER; PR_2 NUMBER; PR_3 VARCHAR2(100); PR_4 VARCHAR2(100); BEGIN TEST_POZ(PR_A => PR_1, PR_B => PR_2, PR_C => PR_3, PR_D => PR_4); END; /
Получаем:
SQL> SET SERVEROUTPUT ON SQL> SQL> DECLARE 2 3 PR_1 NUMBER; 4 PR_2 NUMBER; 5 PR_3 VARCHAR2(100); 6 PR_4 VARCHAR2(100); 7 8 BEGIN 9 10 TEST_POZ(PR_A => PR_1, PR_B => PR_2, PR_C => PR_3, PR_D => PR_4); 11 12 END; 13 / Процедура PL/SQL успешно завершена.
В данном случае я использовал - "именное представление" (named notation), которое PL/SQL унаследовал от языка Ada. В данном случае указываются как формальные, так и фактические параметры. Идем далее. Запишем следующий анонимный блок:
SET SERVEROUTPUT ON DECLARE PR_1 NUMBER; PR_2 NUMBER; PR_3 VARCHAR2(100); PR_4 VARCHAR2(100); BEGIN TEST_POZ(PR_B => PR_2, PR_C => PR_3, PR_D => PR_4, PR_A => PR_1); END; /
Получаем:
SQL> SET SERVEROUTPUT ON SQL> SQL> DECLARE 2 3 PR_1 NUMBER; 4 PR_2 NUMBER; 5 PR_3 VARCHAR2(100); 6 PR_4 VARCHAR2(100); 7 8 BEGIN 9 10 TEST_POZ(PR_B => PR_2, PR_C => PR_3, PR_D => PR_4, PR_A => PR_1); 11 12 END; 13 / Процедура PL/SQL успешно завершена.
В этом примере хорошо видно, что именное представление позволяет изменить порядок следования параметров и вызывать их, так как вам того хотелось бы. Хотя может это не всегда оправдано! :) Далее запишем следующий анонимный блок:
SET SERVEROUTPUT ON DECLARE PR_1 NUMBER; PR_2 NUMBER; PR_3 VARCHAR2(100); PR_4 VARCHAR2(100); BEGIN TEST_POZ(PR_1, PR_2, PR_C => PR_3, PR_D => PR_4); END; / SQL> SET SERVEROUTPUT ON SQL> SQL> DECLARE 2 3 PR_1 NUMBER; 4 PR_2 NUMBER; 5 PR_3 VARCHAR2(100); 6 PR_4 VARCHAR2(100); 7 8 BEGIN 9 10 TEST_POZ(PR_1, PR_2, PR_C => PR_3, PR_D => PR_4); 11 12 END; 13 / Процедура PL/SQL успешно завершена.
Здесь хорошо видно, что позиционное и именное представление можно комбинировать, и использовать совместно. Хотя я думаю, что так легче запутать код, чтобы потом никто нифига не понял! :) Хотя это все оставляется на усмотрение программиста и стиль написания кода! Так же смею заметить, что - чем больше параметров в процедуре, тем сложнее ее вызывать и тем труднее убеждаться в наличии всех требуемых параметров. Если необходимо передать в процедуру или получить из нее достаточно большое число параметров, то рекомендуется определить тип записи, полями которой будут эти параметры. Затем можно использовать единственный параметр имеющий тип записи. В PL/SQL - так же не установлено явное ограничение на количество передаваемых в процедуру параметров.
Значение параметров по умолчанию...
Дело в том, что как и все переменные формальные параметры процедуры могут иметь значения по умолчанию. В таком случае значение параметру, имеющему такое определение можно не передавать. Если же фактический параметр все-таки передан, то принимается именно его значение. Итак, значение по умолчанию указывается вот так:
------------ имя_парметра [вид] {:= | DEFAULT} исходное_значение ------------
Давайте перепишем нашу первую процедуру с параметрами по умолчанию:
CREATE OR REPLACE PROCEDURE TEST_POZ( PR_A IN NUMBER, PR_B IN NUMBER, PR_C IN VARCHAR2 := 'HELLO', PR_D IN VARCHAR2 DEFAULT 'WORLD!!!') IS BEGIN NULL; END TEST_POZ; /
Получаем:
SQL> CREATE OR REPLACE PROCEDURE TEST_POZ( 2 PR_A IN NUMBER, 3 PR_B IN NUMBER, 4 PR_C IN VARCHAR2 := 'HELLO', 5 PR_D IN VARCHAR2 DEFAULT 'WORLD!!!') 6 IS 7 8 BEGIN 9 10 NULL; 11 12 END TEST_POZ; 13 / Процедура создана.
К слову, используйте параметры по умолчанию в конце списка всех параметров процедуры, при этом будет возможность использовать как именное, так и позиционное представление. Вот и все с параметрами процедур, теперь вам стало понятнее как все это работает в PL/SQL! Пробуйте!