Шаг 92 - PL/SQL - Процедуры и параметры еще немного

Что ж давайте покончим с этими параметрами. Осталось рассмотреть тип применения параметров при передаче их в процедуру. Рассмотрим пример. Создадим процедуру следующего вида:

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! Пробуйте!


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 05.02.2004