Модифицируем процедуру, преобразовав выходной параметр так, чтобы он не только возвращал значение в вызывающую среду, но и передавал заданное значение в процедуру. Таким образом, процедура будет вычислять заработную плату сотрудника с заданной должностью, увеличенную на заданную величину. В этом случае, также, необходимо создать хост-переменную и инициализировать ее перед вызовом процедуры.
SQL> CREATE OR REPLACE PROCEDURE emp_sal (v_job IN VARCHAR2, v_sal IN OUT NUMBER)
2 IS
3 v_sal_emp emp.sal%TYPE;
4 BEGIN
5 SELECT sal INTO v_sal_emp FROM emp WHERE LOWER(job)=LOWER(v_job);
6 v_sal := v_sal_emp + v_sal;
7 EXCEPTION
8 WHEN OTHERS THEN
9 DBMS_OUTPUT.put_line('Error occurred');
10 END emp_sal;
11 /
Procedure created.
SQL> VARIABLE h_sal NUMBER
SQL> EXECUTE :h_sal := 100
PL/SQL procedure successfully completed.
SQL> EXECUTE emp_sal('President', :h_sal)
PL/SQL procedure successfully completed.
SQL> PRINT h_sal
H_SAL
----------
5100
Если описание процедуры содержит несколько формальных параметров, для передачи аргументов в процедуру может использоваться несколько способов.
SQL> CREATE OR REPLACE PROCEDURE emp_sal
2 (v_job IN VARCHAR2,
3 v_sal_add IN NUMBER := 100,
4 v_sal_out OUT NUMBER)
5 IS
6 v_sal_emp emp.sal%TYPE;
7 BEGIN
8 SELECT sal INTO v_sal_emp FROM emp WHERE LOWER(job)=LOWER(v_job);
9 v_sal_out := v_sal_emp + v_sal_add;
10 EXCEPTION
11 WHEN OTHERS THEN
12 DBMS_OUTPUT.put_line('Error occurred');
13 END emp_sal;
14 /
Procedure created.
SQL> VARIABLE h_sal NUMBER
· Позиционный – аргументы передаются в том порядке, в котором были перечислены формальные параметры
SQL> EXECUTE emp_sal('President', 200, :h_sal)
PL/SQL procedure successfully completed.
SQL> PRINT h_sal
H_SAL
----------
5200
Если формальные параметры, для которых задано значение по умолчанию, находятся в конце списка формальных параметров, аргументы для этих параметров можно не указывать при вызове процедуры. В этом случае в качестве аргументов будут использоваться значения по умолчанию.
· По имени – аргументы передаются в произвольном порядке. Связь аргумента с формальным параметром осуществляется с помощью специального символа (=>)
SQL> EXECUTE emp_sal(v_sal_out=>:h_sal, v_job=>'President')
PL/SQL procedure successfully completed.
SQL> PRINT h_sal
H_SAL
----------
5100
Если формальные параметры имеют значение по умолчанию, соответствующие аргументы можно не указывать при вызове процедуры. В этом случае в качестве аргументов будут использоваться значения по умолчанию.
· Комбинированный – первые аргументы передаются по порядку, остальные – по имени
SQL> EXECUTE emp_sal('President', v_sal_out=>:h_sal)
PL/SQL procedure successfully completed.
SQL> PRINT h_sal
H_SAL
----------
5100
Если формальные параметры имеют значение по умолчанию, соответствующие аргументы можно не указывать при вызове процедуры. В этом случае в качестве аргументов будут использоваться значения по умолчанию.
Хранимая процедура может быть выполнена, как целое выражение PL/SQL, из любого инструментального средства или языка, поддерживающего PL/SQL. В SQL*Plus для вызова хранимой процедуры используется команда EXECUTE.
Хранимая процедура может быть вызвана из анонимного блока PL/SQL.
SQL> DECLARE
2 v_out NUMBER;
3 v_job VARCHAR2(20) := 'President';
4 v_add NUMBER := 300;
5 BEGIN
6 emp_sal(v_job, v_add, v_out);
7 DBMS_OUTPUT.put_line('Salary of ' || v_job || ' is ' || TO_CHAR(v_out));
8 END;
9 /
Salary of President is 5300
PL/SQL procedure successfully completed.
Хранимая процедура может быть вызвана, также, из другой хранимой процедуры.
SQL> CREATE OR REPLACE PROCEDURE pres_sal
2 IS
3 v_out NUMBER;
4 v_job VARCHAR2(20) := 'President';
5 v_add NUMBER := 300;
6 BEGIN
7 emp_sal(v_job, v_add, v_out);
8 DBMS_OUTPUT.put_line('Salary of ' || v_job || ' is ' || TO_CHAR(v_out));
9 END;
10 /
Procedure created.
SQL> EXECUTE pres_sal
Salary of President is 5300
PL/SQL procedure successfully completed.
Для удаления хранимой процедуры используется команда DDL DROP PROCEDURE.
DROP PROCEDURE имя_процедуры;
SQL> DROP PROCEDURE emp_sal;
Procedure dropped.
SQL> DROP PROCEDURE pres_sal;
Procedure dropped.
Функция – именованный блок PL/SQL, который может принимать значения, вычисляет и возвращает значение. Как правило, функция создается именно для вычисления значения. Функция может храниться, как объект базы данных. Хранимая функция – это функция, которая хранится в базе данных, как объект базы данных.
Хранимая функция создается командой DDL CREATE FUNCTION.
CREATE [OR REPLACE] FUNCTION имя_функции
[(имя_параметра [IN|OUT|INOUT] тип_данных_параметра [:=|DEFAULT выражение], ...) ]
RETURN тип_данных
IS
Блок_PL/SQL;
REPLACE – используется для пересоздания хранимой функции, если она уже существует
имя_функции – имя хранимой функции
имя_параметра – имя формального параметра
тип_данных_параметра – тип данных параметра, указывается без размера
выражение – выражение PL/SQL, задающее начальное значение параметра
тип_данных – тип данных возвращаемого значения, указывается без размера
Блок_PL/SQL - тело процедуры, которое определяет действия, выполняемые функцией.
· Блок PL/SQL начинается со слова BEGIN или с описания локальных переменных
· При описании локальных переменных функции ключевое слово DECLARE не пишется
· Заканчивается блок оператором END или END имя_функции
· В блоке PL/SQL хранимой функции нельзя ссылаться на хост-переменные и переменные подстановки
Чтобы создать хранимую функцию из среды SQL*Plus необходимо выполнить следующие действия:
· Напишите скрипт для создания хранимой функции, начиная с предложения CREATE FUNCTION
· Выполните скрипт из среды SQL*Plus. При этом исходный текст будет откомпилирован и сгенерируется исполняемый код (p-код). Исходный текст будет сохранен в словаре базы данных даже в том случае, если компиляция завершится с ошибками.
· Если компиляция завершится с ошибками, информацию об ошибках компиляции можно получить с помощью команды SQL*Plus SHOW ERRORS
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.