Опубликован: 25.09.2009 | Уровень: специалист | Доступ: платный
Лекция 1:

PL/SQL в Oracle Forms. Блоки и переменные PL/SQL

Лекция 1: 12 || Лекция 2 >
Аннотация: В этой лекции слушатель ознакомится с декларативной средой PL/SQL и ее возможностями, научится создавать блоки и переменные PL/SQL.

PL/SQL - это язык программирования, объединяющий в себе возможности процедурных языков и SQL. Иначе говоря, он представляет собой процедурное расширение языка SQL, отсюда и название - Procedural Language SQL. PL/SQL является родным языком Oracle, так как он интегрирован с сервером базы данных и его код выполняется непосредственно сервером, поэтому программы, написанные на PL/SQL, работают быстро и эффективно. Возможность использовать SQL в блоках PL/SQL - одна из важнейших его характеристик. PL/SQL применяется для доступа к базам данных Oracle из различных сред разработки, одной из которой является Oracle Forms. В этой главе мы ознакомимся с декларативной средой PL/SQL и ее возможностями, научимся создавать блоки и переменные PL/SQL.

Блоки PL/SQL

PL/SQL, как и любой другой процедурный язык программирования, состоит из логически связанных элементов, объединенных в программные единицы, которые называются блоками. Каждый модуль PL/SQL состоит как минимум из одного блока. Блоки PL/SQL могут содержать любое количество подблоков, то есть иметь различный уровень вложенности. Блок как структурная единица логически связанных элементов определяет область их действия, делает код читабельным и простым для понимания. В PL/SQL различают два типа блока:

  • анонимные блоки;
  • именованные блоки.
Анонимные блоки

Анонимные блоки - это блоки, которые не имеют имени. Анонимные блоки не могут быть вызваны другими блоками, так как у них нет имени, на которое можно ссылаться.

Триггеры Oracle Forms и Reports, которые также называются клиентскими триггерами, являются анонимными блоками PL/SQL. Триггеры базы данных и сценарии в SQL*Plus, заключенные в операторские скобки BEGIN и END, также являются анонимными блоками. Ниже приведена структура анонимного блока:

DECLARE
<имя переменной > <тип данных><(значение)>;
BEGIN
< исполняемый оператор>;
EXCEPTION
< оператор обработки исключения >;
END;
  • DECLARE - раздел объявлений. В этом разделе идентифицируются переменные, курсоры и вложенные блоки, на которые имеются ссылки в исполняемом блоке и блоке исключений. Этот раздел необязательный.
  • BEGIN - END - исполняемый раздел. В этом разделе находятся операторы, которые выполняются ядром PL/SQL во время работы вашего приложения. Этот раздел является обязательным.
  • EXCEPTION - раздел исключений. В этом разделе обрабатываются различные исключения, предупреждения и ошибки. Этот раздел необязателен.

Из всех ключевых слов в представленной структуре для анонимного блока ключевые слова BEGIN и END являются обязательными, и между ними должен быть как минимум один исполняемый оператор:

BEGIN 
Null; 
END;

Несмотря на то что ключевые слова BEGIN и END обязательны, в Oracle Forms их можно опустить. Так, к примеру, простейший анонимный блок имеет вид:

BEGIN
Message ('Hello!');
END;

В Oracle Forms этот анонимный блок можно записать и без ключевых слов BEGIN и END:

Message ('Hello!');

Рассмотрим различные виды анонимных блоков.

  1. Блок с разделом объявлений и исключений:
    DECLARE
    <имя переменной > <тип данных><(значение)>;
    BEGIN
    <   исполняемый оператор>;
    EXCEPTION
    <   оператор обработки исключения >;
    END;

    Пример:

    BEGIN
    NULL; 
    EXCEPTION
     WHEN OTHERS THEN NULL; 
    END;
  2. Вложенный блок - это такой вид блока, когда один блок объявляется в исполняемом разделе другого. В большинстве случаев вложенный блок создается с целью размещения в нем раздела EXCEPTION для обработки исключений. Это очень удобно, так как в случае возникновения исключения программа не завершается с ошибкой, а продолжает функционировать, обработав ошибку. Ниже приведен пример вложенного блока:

    Синтаксис:

    BEGIN
    < исполняемый оператор >; 
    BEGIN
    < исполняемый оператор >; 
    EXCEPTION
    < оператор обработки исключения >; 
    END;
    EXCEPTION
    < оператор обработки исключения >; 
    END;

    Практический пример:

    BEGIN 
     NULL; 
     BEGIN
      NULL; 
     EXCEPTION
      WHEN OTHERS THEN NULL; 
     END; 
    NULL; 
    EXCEPTION
     WHEN OTHERS THEN NULL; 
    END;
  3. Вложенный анонимный блок с разделом объявлений и исключений:

    Синтаксис:

    DECLARE
    <имя переменной > <тип данных><(значение)>;
    BEGIN
    < исполняемый оператор >; 
    BEGIN
    < исполняемый оператор >;
    EXCEPTION
    < оператор обработки исключения >;
    END; 
    EXCEPTION
    < оператор обработки исключения >; 
    END;

    Практический пример:

    DECLARE
     x NUMBER(4); 
    BEGIN
     x := 1000; 
     BEGIN
      x := x + 100; 
     EXCEPTION
      WHEN OTHERS THEN x := x + 2; 
     END;
      x := x + 10; 
      DBMS_OUTPUT.PUT_LINE(x); 
    EXCEPTION
     WHEN OTHERS THEN 
      x := x + 3; 
    END;

Когда вы связываете код PL/SQL с триггером или полем, пользуясь таким инструментальным средством, как Forms Builder, этот код составляет анонимный блок PL/SQL. При этом можно создать полный блок с объявлениями, исполняемыми операторами и разделом обработки исключений или же ограничиться только исполняемыми операторами.

Именованные блоки

Именованные блоки - это блоки, которые имеют имя, например, функция или процедура. Несмотря на то что анонимные блоки используются часто, каждый разработчик пытается оформить свою PL/SQL-программу как именованный блок. Преимущество именованного блока в том, что у него есть имя и на него можно ссылаться из других блоков. Если считать главным отличием между анонимным блоком и именованным отсутствие имени у первого, то тогда в Forms понятие анонимного блока очень размыто. В Oracle Forms, несмотря на то что пользовательский

триггер будет считаться анонимным блоком, его все же можно вызвать и на него можно ссылаться. Ниже приведен пример именованного блока функции и процедуры:

PROCEDURE [схема.] имя [(параметр [, параметр ...])]
   [AUID {DEFINER | CURRENT_USER}] 
FUNCTION [схема.] имя [(параметр [, параметр ...])]
   RETURN тип_возвращаемых_данных
   [AUID {DEFINER | CURRENT_USER}]
   [DETERMINISTIC]
   [PARALLEL ENABLE ...]
   [PIPELINED]

Заголовок функции отличается от заголовка процедуры лишь ключевым словом RETURN.

Именованные блоки, так же как и анонимные, могут быть вложенными, причем анонимный блок может быть вложен в именованный блок. Ниже приведен пример такого блока:

PROCEDURE calc_totals 
IS
 year_total NUMBER; 
BEGIN
 year_total := 0;
 
 /* Начало вложенного блока */ 
 DECLARE
  month_total NUMBER; 
 BEGIN
  month_total := year_total / 12; 
 END set_month_total; 
 /* Конец вложенного блока */ 
END;

В этом разделе мы ознакомились с понятием блока в PL/SQL, научились определять типы блоков и их структуру. Остается лишь сделать вывод из всего вышеперечисленного: PL/SQL предоставляет разработчику возможность писать удобочитаемый и гибкий код, подходить к написанию программы как к творческому процессу, требующему нестандартного мышления.

Лекция 1: 12 || Лекция 2 >
Константин Лукин
Константин Лукин

ошибка: FRM47337  Tree node label can not be null

при выполнении скрипта

DECLARE
 Itree ITEM;
 top_node Ftree.Node;
 new_node Ftree.Node;
 i_value VARCHAR2(30);
BEGIN
 Itree := Find_Item('tree_block.tree_item ');
 new_node := Ftree.Add_Tree_Node(Itree, Ftree.ROOT_NODE,
   Ftree.PARENT_OFFSET, Ftree.LAST_CHILD,
   Ftree.EXPANDED_NODE, i_value, NULL, i_value);
END;

Юлия Малыгина
Юлия Малыгина
приведена функция скрытия URL отчета и ее применение, но применения так и нет
Андрей Кошелев
Андрей Кошелев
Россия, Москва, Московская Финансово-Юридическая Академия
Артем Чуйко
Артем Чуйко
Россия, Самара