Курсор Oracle has_value используется, но не существует

#sql #oracle #plsql #oracle10g

#sql #Oracle #plsql #oracle10g

Вопрос:

У меня есть этот гигантский запрос, в котором используется некоторый текст, который выглядит как переменные, но я понятия не имею, что это такое, и я действительно не могу в этом разобраться. Они не являются глобальными или не определены где-либо еще в пакете oracle. В частности, приведенная ниже переменная (или что бы это ни было) с именем «has_value» настолько сбивает с толку, потому что она используется во многих случаях для запросов по множеству таблиц.

 PROCEDURE assemble_default_where(
    i_search_id    IN     search_table.search_id%TYPE,
    o_where_clause OUT    VARCHAR2,
    o_from_clause  OUT    VARCHAR2,
    o_error_number OUT    error_message.error_number%TYPE) IS
    l_base VARCHAR2(30) := 'd';

    CURSOR c_where_clause IS
      SELECT   DECODE
                 (sl.parameter_name,
                  'track Location', join_operator || ' ' || open_brackets || ' ' || not_operator || ' EXISTS(SELECT 1 FROM track_locations loc WHERE ' || l_base
                   || '.plan_number = loc.plan_number AND ' || l_base || '.order_id = loc.order_id AND loc.t_id = NVL('''
                   || track_location_rsect_id(has_value) || ''', loc.t_id) AND loc.tstatus = NVL(''' || track_tstatus_id(has_value)

FROM     search_lines sl
      WHERE    search_id = i_search_id
      ORDER BY line_no;
 

Я пропустил часть запроса, потому что это не имеет отношения к моему вопросу.

Я хочу знать, откуда берутся join_operator, has_value и open_brackets и что они собой представляют???

Ответ №1:

Есть несколько вариантов:

  1. Переменная — определяется во внешнем блоке.
  2. Переменная — определяется в теле пакета.
  3. Переменная — определяется в спецификации пакета.
  4. Столбец — одни и те же имена столбцов могут быть во многих таблицах.
  5. Функция — в схеме вызывающего или определяющего.
  6. Библиотека — в схеме вызывающего или определяющего.
  7. Оператор — в схеме вызывающего или определяющего.
  8. Синоним — к функции, оператору или библиотеке.

На практике вы, вероятно, уже заметили бы, если бы это было # 1, # 2, # 3 или # 4. А №6 и №7 встречаются очень редко. Я бы предположил, что это функция или синоним функции.

Чтобы исключить переменные, выполните поиск по коду либо в вашей IDE, либо с помощью этого SQL:

 select * from dba_source where lower(text) like '%join_operator%';
 

Чтобы исключить объекты, выполните поиск по всем объектам с помощью этого SQL:

 select * from dba_objects where object_name = 'JOIN_OPERATOR';
 

Обновить

PL / SQL и DBA_DEPENDENCIES также может помочь идентифицировать объекты.

Пример схемы

 alter session set plscope_settings = 'IDENTIFIERS:ALL';

create table search_lines(
    search_id number, line_no number, parameter_name varchar2(100));

create or replace function join_operator_function return varchar2 is
begin
    return 'asdf';
end;
/

create synonym join_operator for join_operator_function;

create or replace PROCEDURE assemble_default_where
is
    CURSOR c_where_clause IS
    SELECT DECODE(sl.parameter_name, 'track Location', join_operator)
    FROM     search_lines sl
    ORDER BY line_no;
begin
    null;
end;
/
 

Пример PL / SCOPE

 WITH v AS (
  SELECT    Line,
            Col,
            INITCAP(NAME) Name,
            LOWER(TYPE)   Type,
            LOWER(USAGE)  Usage,
            USAGE_ID,
            USAGE_CONTEXT_ID
    FROM USER_IDENTIFIERS
      WHERE Object_Name = 'ASSEMBLE_DEFAULT_WHERE'
        AND Object_Type = 'PROCEDURE'
)
SELECT RPAD(LPAD(' ', 2*(Level-1)) ||
                 Name, 30, '.')||' '||
                 RPAD(Type, 30)||
                 RPAD(Usage, 30)
                 IDENTIFIER_USAGE_CONTEXTS
  FROM v
  START WITH USAGE_CONTEXT_ID = 0
  CONNECT BY PRIOR USAGE_ID = USAGE_CONTEXT_ID
  ORDER SIBLINGS BY Line, Col
/

Assemble_Default_Where........ procedure                     declaration
  Assemble_Default_Where...... procedure                     definition
    C_Where_Clause............ cursor                        declaration
      Join_Operator_Function.. function                      call
 

Пример DBA_DEPENDENCIES

 select referenced_owner, referenced_name, referenced_type
from dba_dependencies
where owner = user
    and name = 'ASSEMBLE_DEFAULT_WHERE';       

REFERENCED_OWNER    REFERENCED_NAME                 REFERENCED_TYPE
----------------    ---------------                 ---------------
SYS                 STANDARD                        PACKAGE
SYS                 SYS_STUB_FOR_PURITY_ANALYSIS    PACKAGE
JHELLER_DBA         JOIN_OPERATOR                   SYNONYM
JHELLER_DBA         JOIN_OPERATOR_FUNCTION          FUNCTION
JHELLER_DBA         SEARCH_LINES                    TABLE
 

Комментарии:

1. Спасибо за ответ, я исключил объекты с вашим запросом, поскольку результатов не было. Я также исключил переменные, выполнив поиск в своем коде и выполнив ваш запрос.

2. Я также только что проверил dba_synonyms и не нашел там ничего похожего на join_operator или has_value

3. Еще одна вещь, которую нужно проверить — действительна ли процедура?