Oracle 游标 has_value 已使用但不存在
Posted
技术标签:
【中文标题】Oracle 游标 has_value 已使用但不存在【英文标题】:Oracle Cursor has_value Used But Doesn't Exist 【发布时间】:2014-06-27 07:56:12 【问题描述】:我有一个巨大的查询,其中使用了一些看起来像变量的文本,但我不知道它们是什么,我真的无法弄清楚。它们不是全局的,也不是在 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
【讨论】:
感谢您的回复,由于没有结果,我排除了您查询的对象。我还通过搜索我的代码并运行您的查询来排除变量。 我刚刚也检查了 dba_synonyms 并没有发现像 join_operator 或 has_value 之类的东西 要检查的另一件事 - 程序是否有效?以上是关于Oracle 游标 has_value 已使用但不存在的主要内容,如果未能解决你的问题,请参考以下文章