Информационное обеспечение



бет15/56
Дата05.03.2023
өлшемі256,49 Kb.
#71567
түріПрактикум
1   ...   11   12   13   14   15   16   17   18   ...   56
Процедуры. Общий синтаксис создания:

[CREATE [OR REPLACE]]


PROCEDURE имя_процедуры[(параметр1[, параметр2]...)] [AUTHID {DEFINER | CURRENT_USER}]
{IS | AS}
[PRAGMA AUTONOMOUS_TRANSACTION;]
[локальные объявления переменных] BEGIN
Исполняемые_операторы [EXCEPTION
обработка_ошибок] END [имя процедуры];

где параметр объявляется как


имя_параметра [IN | OUT [NOCOPY] | INOUT [NOCOPY]] тип_данных [{:= | DEFAULT} выражение]


Существуют три режима использования параметра:


IN – параметр только для чтения, не может изменяться в подпрограмме. Как правило, так описываются входные параметры, которые используются внутри модуля как константы. Режим IN применяется по умолчанию.
OUT – параметр только для записи, не может применяться для получения подпрограммой (процедурой или функцией) значения. Как правило, так описы- ваются выходные параметры, с помощью которых модуль возвращает значение.
IN OUT – параметр для чтения и записи. Значения такого параметра можно передавать в подпрограмму и возвращать их обратно вызывающей программе.
Параметры могут передаваться двумя методами:

  1. по ссылке – с соответствующим формальным параметром связывается не значение, а указатель на область памяти, где хранится значение фактическо- го параметра;

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

Когда в качестве параметров передаются большие структуры данных (списки, объекты и т. д.), объявленные с ключевым словом OUT или IN OUT, то при применении передачи по значению (что является режимом по умолчанию для параметров OUT, IN OUT) происходит копирование этих структур в фор- мальные параметры, что может замедлить работу программы. Для передачи па- раметров по ссылке используется ключевое слово NOCOPY.
При указании типа параметра дается ссылка на сам тип, без указания раз- мерности, например:

PROCEDURE Myproc (param1 IN NUMBER(2)); -- ошибка PROCEDURE Myproc (param1 IN NUMBER); -- правильно


Атрибут AUTHID определяет, будет ли процедура выполняться с правами владельца – DEFINER (определяется по умолчанию) – или правами текущего пользователя – CURRENT_USER.
Прагма AUTONOMOUS_TRANSACTION – это инструкция компилятору, которая позволяет выполнить код процедуры в отдельной независимой тран- закции и требует обязательного наличия в подпрограмме завершения транзак- ции оператором COMMIT или ROLLBACK.
В разделе локальных объявлений описываются локальные переменные, кон- станты, курсоры, область действия которых определяется рамками процедуры.
Вызов процедуры осуществляется по ее имени. Значения для параметров процедуры могут передаваться либо по позиции параметра в списке парамет- ров, либо по имени параметра. Список значений размещается в круглых скоб- ках вслед за именем процедуры. Для вызова процедуры можно воспользоваться
командой SQL*Plus EXECUTE имя_процедуры или командой CALL имя_процедуры или выполнить анонимный блок.
CREATE OR REPLACE PROCEDURE show_the_date IS
Today DATE DEFAULT SYSDATE; BEGIN
--вывести текущую дату DBMS_OUTPUT.PUT_LINE ('сегодня ' ||today); END show_the_date;
/
Вызов процедуры c помощью анонимного блока:

BEGIN
show_the_date; END;


/

Создаем процедуру для изменения заработной платы одному сотруднику в схеме HR.


CREATE OR REPLACE PROCEDURE CHANGE_SALARY (empId IN


number, newsal IN number) IS
maxsal JOBS.MAX_SALARY%Type; minsal JOBS.MIN_SALARY%Type; sal employees.salary%TYPE;
v_job VARCHAR2(10);

BEGIN
SELECT job_id, salary INTO v_job, sal


FROM employees WHERE employee_id=empId;

IF sal <> newsal THEN


SELECT max_salary, min_salary INTO maxsal, minsal
FROM jobs WHERE job_id = (SELECT job_id FROM employees WHERE employee_id=empId);
UPDATE employees SET salary=newsal WHERE employee_id=empId; COMMIT;
DBMS_OUTPUT.PUT_LINE ('Сотрудник '||empID||': старая заработная плата = '|| sal||', новая заработная плата = '||newsal);
END IF; END;
/
Вызов с передачей параметров по позиции:

BEGIN
CHANGE_SALARY (105,8000); END;


/

Вызов с передачей параметров по имени:


BEGIN
CHANGE_SALARY (newsal => 9350, empId=>105); END;


/

Процедуры нельзя применять для выполнения запросов, потому что они не возвращают результат.




Достарыңызбен бөлісу:
1   ...   11   12   13   14   15   16   17   18   ...   56




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет