Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Задачка по all_identifiers  [new]
Allbest
Member

Откуда:
Сообщений: 143
С помощью sql получить список всех видимых переменных для данной строки кода (кодом может быть любой plsql-объект -пакет, тип, функция, процедура, триггер)
27 авг 15, 12:07    [18075558]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
varlamovvp
Member

Откуда: Moscow
Сообщений: 298
Allbest,

кажется мне, что задачу эту корейцы решали, когда ORACLE корейский писали.

я бы глянул в сторону стандартных ORACLE средств для этого ...
27 авг 15, 12:27    [18075699]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
varlamovvp
ORACLE корейский
Можно ссылку? Хочется новых ощущений с Ораклом.

2ТС, эта задача не по all_identifiers, а по написанию своего компилятора.
27 авг 15, 12:31    [18075725]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
Allbest
Member

Откуда:
Сообщений: 143
varlamovvp
ORACLE корейский

Мне кажется, varlamovvp шутит )) Но корейцы, без всяких сомнений, круты ))

varlamovvp
я бы глянул в сторону стандартных ORACLE средств для этого ...

Дорабатывается шелл для дебаггера на основе plsql с учетом новых фичей 11-го, свой запрос почти сделал. Как станет более красивым - выложу. Но больно он громоздок
27 авг 15, 12:40    [18075797]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
varlamovvp
Member

Откуда: Moscow
Сообщений: 298
Глупый Телевизор,

TIBERO назвали продукт сей

"
Отчет по результатам испытательного тестирования СУБД Tibero
Федеральный центр информатизации Счетной палаты Российской Федерации
"
занятный документ
27 авг 15, 12:40    [18075800]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
Allbest
Member

Откуда:
Сообщений: 143
varlamovvp
Глупый Телевизор,

TIBERO назвали продукт сей



воно как!
27 авг 15, 12:42    [18075819]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
varlamovvp
Member

Откуда: Moscow
Сообщений: 298
Allbest,

в каждой шутке есть доля шутки
как быть, если в пакете есть процедура, внутри которой написана еще одна процедура, в которой есть контрукция вида
FOR i IN ...

переменная i видна тут, но может быть видна снаружи одноименная и т.п.
Область видимости и т.п.
По моим ощущениям это полноценный парсер PL/SQL
27 авг 15, 12:43    [18075829]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
varlamovvp
Member

Откуда: Moscow
Сообщений: 298
да еще и гранты пользователя и создателя пакета проверить на доступ к другим объектам ...
27 авг 15, 12:45    [18075846]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
Allbest
Member

Откуда:
Сообщений: 143
varlamovvp
Allbest,
переменная i видна тут, но может быть видна снаружи одноименная и т.п.
Область видимости и т.п.
По моим ощущениям это полноценный парсер PL/SQL

А в курсе структуры вьюхи? Это иерархия. Парсинг существенный уже есть
Пример использования, например, здесь
http://www.oracle.com/technetwork/issue-archive/2007/07-jan/o50plsql-165471.html
27 авг 15, 12:45    [18075848]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
Allbest
Member

Откуда:
Сообщений: 143
varlamovvp
да еще и гранты пользователя и создателя пакета проверить на доступ к другим объектам ...

Вот это уже за рамками данной задачи :) Обойдемся
27 авг 15, 12:47    [18075859]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
varlamovvp
Member

Откуда: Moscow
Сообщений: 298
Allbest,

PL/Scope
точно! слово забыл иностранное :(
27 авг 15, 12:48    [18075867]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
Allbest
Member

Откуда:
Сообщений: 143
[quot varlamovvp]PL/Scope/quot]
Именно, с помощью этого механизма и заполняется вьюха all_identifiers
27 авг 15, 13:08    [18076056]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
Allbest
Member

Откуда:
Сообщений: 143
Примерно так:

with a as
 (select *
    from all_identifiers a
   where a.object_name = '&obj_name'
     and a.object_type = '&obj_type'
     and a.line <= &line
     and a.usage not in ('REFERENCE' /*,  'ASSIGNMENT', 'CALL'*/)
     and rownum > 0),
identifer_hier as
 (select rpad(' ', level, ' ') || a.name name_tree,
         trim(both '/' from sys_connect_by_path((case
                                    when a.usage = 'DEFINITION' and a.type not in ('RECORD',
                                                                                   'VARIABLE',
                                                                                   'NESTED TABLE',
                                                                                   'CONSTANT',
                                                                                   'VARRAY',
                                                                                   'ITERATOR',
                                                                                   'REFCURSOR',
                                                                                   'SUBTYPE',
                                                                                   'FORMAL IN',
                                                                                   'FORMAL OUT') then
                                     a.name
                                    else
                                     null
                                  end),
                                  '/')) proc_tree,
         trim(both '/' from sys_connect_by_path((case
                                    when a.usage = 'DECLARATION' and a.type in ('RECORD',
                                                                                'VARIABLE',
                                                                                'NESTED TABLE',
                                                                                'CONSTANT',
                                                                                'VARRAY',
                                                                                'ITERATOR',
                                                                                'REFCURSOR',
                                                                                'SUBTYPE',
                                                                                'FORMAL IN',
                                                                                'FORMAL OUT') then
                                     a.name
                                    else
                                     null
                                  end),
                                  '/')) var_tree,
         trim(both '/' from sys_connect_by_path((case
                                    when a.usage = 'DECLARATION' and a.type in ('RECORD',
                                                                                'VARIABLE',
                                                                                'NESTED TABLE',
                                                                                'CONSTANT',
                                                                                'VARRAY',
                                                                                'ITERATOR',
                                                                                'REFCURSOR',
                                                                                'SUBTYPE',
                                                                                'FORMAL IN',
                                                                                'FORMAL OUT') then
                                     a.type
                                    else
                                     null
                                  end),
                                  '/')) tipe_tree,
         level lev,
         a.*,
         rownum rown,
         trim(both '/' from sys_connect_by_path((case
                                    when a.usage = 'DEFINITION' then
                                     a.signature
                                    else
                                     null
                                  end),
                                  '/')) proc_signature_tree
    from a
  connect by prior usage_id = usage_context_id
   start with usage_context_id = 0
  /*ORDER SIBLINGS BY a.line, a.col*/
  ),
identifer_hier_mod as
 (select identifer_hier.*,
         last_value(identifer_hier.usage) over(order by rown rows between unbounded preceding and unbounded following) last_usage,
         last_value(identifer_hier.proc_signature_tree) over(order by rown rows between unbounded preceding and unbounded following) last_proc_signature_tree
    from identifer_hier)
select *
  from identifer_hier_mod
 where identifer_hier_mod.last_proc_signature_tree like identifer_hier_mod.proc_signature_tree || '%'
   and identifer_hier_mod.type in ('VARIABLE', 'FORMAL IN', 'CONSATNT', 'FORMAL OUT', 'ITERATOR')
   and identifer_hier_mod.usage not in ('REFERENCE', 'ASSIGNMENT', 'CALL')
 order by rown;
27 авг 15, 19:54    [18078110]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
-2-
Member

Откуда:
Сообщений: 15330
Allbest,

Для тестов:
create or replace package packai as
a number;
procedure p(b number);
end;
/

create or replace package body packai as
procedure p(b number) is
   c number;
begin
   declare
      f number;
   begin
      a := 1; 
   end;
   for i in 1..2 loop
      a := 2;
   end loop;
   a := 3; --?
end;
begin 
   a := 4;
end;
/
обрати внимание на --?, да и остальные контексты
28 авг 15, 00:12    [18078935]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
Allbest
Member

Откуда:
Сообщений: 143
Намек понял. Да, пока не учитываются переменные из заголовка пакета....
28 авг 15, 08:39    [18079221]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по all_identifiers  [new]
Allbest
Member

Откуда:
Сообщений: 143
Но, в сущности, в любой точке процедуры доступны глобальные переменные из заголовков ВСЕХ пакетов (гранты не рассматриваем). Поэтому проблемы никакой нет. Задачу, видимо, можно считать решенной. Однако, есть один минус, вытекающий из самого функционала. Все plsql-блоки живут на одном уровне (вложенность на их уровне не работает). Бага это или фича - не знаю
28 авг 15, 16:50    [18082609]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить