#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. А №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. Еще одна вещь, которую нужно проверить — действительна ли процедура?