После того, как команда CREATE OR REPLACE создает процедуру или функцию, она сразу сохраняется в БД, в скомпилированной форме, которая называется p-кодом (p-code). В p-коде содержатся все обработанные ссылки подпрограммы, а исходный текст преобразован, в вид удобный для чтения системой поддержки PL/SQL. При вызове хранимой процедуры p-код считывается с диска и выполняется.
Процедура – подпрограмма, которую вызывают для того, чтобы выполнить некоторое действие. Функция – подпрограмма, которую вызывают, для того, чтобы вычислить некоторое значение. Для передачи данных в функцию или процедуру используются параметры. Каждый параметр имеет имя, тип данных и тип параметра.
Типы параметров: IN – входной, только для чтения, служит для передачи данных в подпрограмму; OUT – выходной, только для записи, служит для возвращения данных из подпрограммы; IN OUT – и входной и выходной, для чтения и записи, позволяет передавать в подпрограмму начальные значения и возвращать обновленные значения вызывающей программе.
Существует два типа передачи параметров в подпрограммах. Позиционное представление и именное представление. Позиционное более похоже на традиционную передачу параметра в языках программирования. Приведу небольшой пример:
- DECLARE
- Param1 NUMBER;
- Param2 VARCHAR2(100);
- BEGIN
- TEST_POZ(Param1, Param2);
- END;
- /
Зачастую рекомендуют пользоваться именно таким способом передачи данных.
Именное представление или же named notation было унаследовано от языка «Ada». В таком виде передачи данных используются как формальные, так и фактические параметры. К примеру:
- DECLARE
- Param1 NUMBER;
- Param2 VARCHAR2(100);
- BEGIN
- TEST_POZ(FParam1 => Param1, FParam2 => Param2);
- END;
- /
Это дает возможность при желании установить собственный порядок аргументов.
Так же существуют два типа параметров: фактические и формальный. Фактический – это тот параметр, которые передается в списке параметров в вызове подпрограммы, к примеру raise_salary(emp_num, amount). А вот те параметры, которые объявлены в теле функции или процедуре raise_salary называются формальными.