- •Создание пакетов
- •3 Procedure reset_comm
- •4 (V_comm in number);
- •5 End comm_package;
- •2 Function validate_comm
- •V_mgr in emp.Mgr%type,
- •V_empno number;
- •Index by binary integer;
- •2 Emp_table emp_package.Emp_table type;
- •Index by binary_integer;
- •Into g_comm
- •Interest real; -- общая переменная
- •Interest number
- •Into interest --процедуры
- •V_message varchar2(50);
- •V_proc_name || ‘ end;’;
- •V_cursor integer;
- •V_return integer;
- •V_ename emp.Ename%type;
- •V_sal emp.Sal%type;
- •V_column_value varchar(30) ;
- •Var v_out1 varchar2(10);
- •Var v_out2 number;
- •Контрольные вопросы.
V_ename emp.Ename%type;
V_sal emp.Sal%type;
V_column_value varchar(30) ;
-- Символьная строка с SQL-оператором
sql_statement VARCHAR(200) :=
'SELECT ename, sal FROM ' || p_table_name ||
' WHERE ' || p_column_name || '=:col_value';
--
BEGIN
-- Аргумент в BIND_VARIABLE не может прямо указывать -- на параметр “p_column_value”
v_column_value := upper(p_column_value);
-- Открываем новый курсор
mycursor := dbms_sql.open_cursor ;
-- Связываем SQL-оператор с курсором
dbms_sql.parse(mycursor,sql_statement,dbms_sql.native);
-- Связываем значение v_column_value с переменной
-- 'col_value' из SQL-оператора
dbms_sql.bind_variable(mycursor,'col_value',v_column_value);
-- Определяем выбираемые столбцы
dbms_sql.define_column(mycursor,1,v_ename,30);
dbms_sql.define_column(mycursor,2,v_sal);
-- Выполняем SQL-оператор и выбираем строку
myreturn := dbms_sql.execute(mycursor);
myreturn := dbms_sql.fetch_rows(mycursor);
IF myreturn = 0 THEN
RAISE no_data_found;
END IF;
-- Заполняем переменные. Смотрим, есть ли ещё строки
dbms_sql.column_value(mycursor,1,v_ename);
dbms_sql.column_value(mycursor,2,v_sal);
myreturn := dbms_sql.fetch_rows(mycursor) ;
IF myreturn > 1 THEN
RAISE too_many_rows;
END IF;
-- Присваиваем значения выходным параметрам
p_name := v_ename;
p_salary := v_sal;
-- Закрываем курсор
dbms_sql.close_cursor(mycursor);
-- Если что-то было не так, то …
EXCEPTION
WHEN others THEN
dbms_output.put('error - sqlcode is : ');
dbms_output.put_line(to_char(sqlcode));
dbms_output.put_line('message is : '||sqlerrm);
p_name := null;
END;
/
Вызов описанной процедуры:
Var v_out1 varchar2(10);
Var v_out2 number;
SET serveroutput ON
EXECUTE exec_select('&table_name','&column_name',-
'&column_value',:v_out1,:v_out2);
PRINT v_out1;
PRINT v_out2;
Пакет DBMS_OUTPUT
Пакет DBMS_OUTPUT используется для вывода значений и сообщений из триггеров, хранимых процедур и функций.
Практическое применение:
Можно вывести на экран промежуточные результаты для отладки.
Этот пакет позволяет разработчикам четко отслеживать выполнение функции или процедуры благодаря посылке сообщений и значений в выходной буфер.
Функция или процедура |
Описание |
PUT |
Добавляет текст из процедуры к текущей строке в выходном буфере. |
NEW_LINE |
Помещает в выходной буфер маркер конца строки. |
PUT_LINE |
Совмещает действие PUT и NEW_LINE. |
GET_LINE |
Извлекает текущую строку из выходного буфера и передает ее в процедуру. |
GET_LINES |
Извлекает из выходного буфера массив строк и передает их в процедуру. |
ENABLE или DISABLE |
Разрешает или запрещает вызовы процедур DBMS_OUTPUT. |
Пакет DBMS_DDL
Пакет DBMS_DDL перекомпилируют процедуры, функции и пакеты, а также анализирует индексы, таблицы и кластеры.
Этот пакет позволяет разработчикам использовать команды COMPILE и ANALYZE SQL через окружение PL/SQL.
Пакет DBMS_DDL не может использоваться в триггерах, процедурах, вызываемых из SQL*Forms, а также в удаленных сеансах.
Практическое применение:
Измененные процедуры, функции и пакеты можно перекомпилировать с помощью DBMS_DDL.ALTER_COMPILE.
Проанализировать один объект можно с помощью процедуры DBMS_DDL.ANALYZE_OBJECT. (Для одновременного анализа нескольких объектов используется процедураDBMS_UTILITY.ANALYZE_SCHEMA.)
Функция или процедура |
Описание |
ALTER_COMPILE |
Перекомпилирует процедуры, функции и пакеты. |
ANALYZE_OBJECT |
Анализирует индексы, таблицы и кластеры. Анализ производится для всех строк или процента строк. |
Дополнительные характеристики пакетов:
Перегрузка
Объявление идентификаторов до ссылок на них
Процедуры, выполняемые только один раз
Уровень чистоты пакетных функций
Примечания
Вы можете использовать преимущества стандартных пакетов, поставляемых с сервером Oracle.
При разработке приложений можно использовать пакеты как библиотеки подпрограмм.
Файл-сценарий catproc.sqlпозволяет создать сразу все пакеты. Каждый пакет может быть создан и отдельным скрипт-файлом.
DBMS_ALERT |
dbmsalrt.sql |
DBMS_APPLICATION_INFO |
dbmsutil.sql |
DBMS_DDL |
dbmsutil.sql |
DBMS_LOCK |
dbmslock.sql |
DBMS_MAIL |
dbmsmail.sql |
DBMS_OUTPUT |
dbmsotpt.sql |
DBMS_PIPE |
dbmspipe.sql |
DBMS_SESSION |
dbmsutil.sql |
DBMS_SHARED_POOL |
dbmsspool.sql |
DBMS_SQL |
dbmssql.sql |
DBMS_TRANSACTI0N |
dbmsutil.sql |
DBMS_UTILITY |
dbmsutil.sql |
Резюме
Использование пакетов:
Улучшает организацию, управление и защиту. Повышает производительность.
Позволяет группировать взаимосвязанные процедуры и функции.
Позволяет модифицировать тело пакета, не затрагивая спецификацию.
Позволяет предоставить право доступа ко всему пакету.
При использовании пакетов:
Исходный код скрыт от пользователей.
При первом вызове в память загружается весь пакет.
Уменьшается количество обращений к диску для последующих вызовов.
Предоставляются идентификаторы для сеанса пользователя.