кодесурса
«PL / SQL

Упражнения по основам PL / SQL: область видимости и глобальные идентификаторы

script1adsense2code
script1adsense3code

Основы PL / SQL: упражнение-8 с решением

Напишите блоки PL / SQL, чтобы показать область видимости локальных и глобальных идентификаторов.

В следующем блоке PL / SQL показано, как можно определить область действия и видимость нескольких идентификаторов. В первом подблоке глобальный идентификатор var_a объявлен снова. Чтобы сослаться на глобальную переменную var_a, первый подблок должен был бы квалифицировать ее с именем и типом данных внешнего блока. Таким образом, первый подблок не может ссылаться на глобальную переменную var_a; он может ссылаться только на свою локальную переменную var_a. Следовательно, первый субблок не может ссылаться на var_d, а второй субблок не может ссылаться на var_c.

Код PL / SQL:

DECLARE
  var_a INTEGER;  -- Scope of var_a is INTEGER beginning
  var_b REAL;    -- Scope of var_b is REAL 
BEGIN
  var_a:=5;
  var_b:=10.25;
  -- Visible: var_a (INTEGER), var_b (REAL)
  DBMS_OUTPUT.PUT_LINE('In the Outer Block');
  DBMS_OUTPUT.PUT_LINE('var_a =' || var_a); -- var_a  is INTEGER
  DBMS_OUTPUT.PUT_LINE('var_b =' || var_b); -- var_b is REAL
  -- Start First sub-block:
  DECLARE
    var_a CHAR;  -- Scope of var_a have changed into CHAR and beginning from here
    var_c REAL;       -- Scope of var_c is REAL
  BEGIN
    var_a:='C';
    var_c:=15.50;
    -- Visible: var_a (CHAR), var_b (REAL), var_c (REAL)
    DBMS_OUTPUT.PUT_LINE('In the First sub-Block');
    DBMS_OUTPUT.PUT_LINE('var_a =' || var_a); -- var_a is CHAR
    DBMS_OUTPUT.PUT_LINE('var_b =' || var_b); -- var_b is REAL
    DBMS_OUTPUT.PUT_LINE('var_c =' || var_c); -- var_c is REAL
    NULL;
  END;          --  ending first sub-block
  -- Start Second sub-block:
  DECLARE
    var_d REAL;     -- Scope of var_d beginning from here with REAL
  BEGIN
    -- Visible: var_a here is CHAR and  var_b is REAL AND  var_d is REAL
    var_d:=20.75;
    DBMS_OUTPUT.PUT_LINE('In the Second sub-Block');
    DBMS_OUTPUT.PUT_LINE('var_a =' || var_a); -- var_a is CHAR
    DBMS_OUTPUT.PUT_LINE('var_b =' || var_b); -- var_b is REAL
    DBMS_OUTPUT.PUT_LINE('var_d =' || var_d); -- var_d is REAL
    NULL;
  END;          -- ending second sub-block
-- Visible: var_a is INTEGER and var_b is REAL
-- This is also in the Outer Block
DBMS_OUTPUT.PUT_LINE('At the end in the  Outer-Block');
DBMS_OUTPUT.PUT_LINE('var_a =' || var_a); -- var_a  is INTEGER
DBMS_OUTPUT.PUT_LINE('var_b =' || var_b); -- var_b is REAL
END;            --   ending the outer block
/

Пример вывода:

 Во внешнем блоке
var_a = 5
var_b = 10,25
В первом подблоке
var_a = C
var_b = 10,25
var_c = 15,5
Во втором подблоке
var_a = 5
var_b = 10,25
var_d = 20,75
В конце во Внешнем блоке
var_a = 5
var_b = 10,25
Заявление обработано.
0,01 секунды

Блок - схема:

«Блок-схема:

Напишите блок PL / SQL, чтобы показать, как снова объявлять глобальный идентификатор для квалификации в метке блока.

В следующем примере внешний блок определен с именем external_block в качестве метки. Следовательно, после того, как подблок снова объявил глобальную переменную x, он может ссылаться на эту глобальную переменную, квалифицируя ее имя меткой блока. Подблок также может ссылаться на свою локальную переменную x по простому имени.

Код PL / SQL:

<<outer_block>>  -- outer label
DECLARE
  x INTEGER :=10;
BEGIN
  DECLARE
    x INTEGER := 15;
  BEGIN
    IF x = outer.x THEN
      DBMS_OUTPUT.PUT_LINE ('The value is same');
    ELSE
      DBMS_OUTPUT.PUT_LINE ('The value is different');
    END IF;
  END;
END;
/

Пример вывода:

 Значение отличается
Заявление обработано.
0,14 секунды

Блок - схема:

«Блок-схема:

Напишите блок PL / SQL, чтобы показать, как объявлять блок с несколькими и дублированными метками.

В следующем примере две метки были определены для внешнего блока, external_label_block и inner_label_block. Inner_label_block появляется снова во внутреннем блоке. Во внутреннем блоке inner_label_block.divisor ссылается на делитель локальной переменной, а не на делитель глобальной переменной, что приводит к ошибке ZERO_DIVIDE.

Код PL / SQL:

<<outer_label_block>>
<<inner_label_block>>
DECLARE
  dividend   NUMBER := 47;
  divisor NUMBER := 9;
BEGIN
<<inner_label_block>>
  DECLARE
    divisor NUMBER := 0;
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Quotient with outer_label_block.divisor =');
    DBMS_OUTPUT.PUT_LINE(dividend/outer_label_block.divisor);
 
    DBMS_OUTPUT.PUT_LINE('Quotiet with inner_label_block.divisor =');
    DBMS_OUTPUT.PUT_LINE(dividend/inner_label_block.divisor);
 
  EXCEPTION
    WHEN ZERO_DIVIDE THEN
      DBMS_OUTPUT.PUT_LINE('Divide-by-zero error: can''t divide '
        || dividend || ' by ' || divisor);
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Unexpected error.');
  END inner_label_block;
END outer_label_block;
/

Блок - схема:

«Блок-схема:

Пример вывода:

 Частное с external_label_block.divisor = 
5,22222222222222222222222222222222222222
Соотношение с inner_label_block.divisor = 
Ошибка деления на ноль: невозможно разделить 47 на 0
Заявление обработано.
0,13 секунды

Улучшите этот пример решения и опубликуйте свой код через Disqus

Предыдущий: Напишите блоки PL / SQL, чтобы показать объявление переменных.
Далее: Напишите блок PL / SQL, чтобы показать действительную независимую от регистра ссылку на цитируемый и без заключенного в кавычки пользовательского идентификатора.

Каков уровень сложности этого упражнения?

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code