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 已使用但不存在的主要内容,如果未能解决你的问题,请参考以下文章

游标的常用属性

Oracle游标使用总结

如何使用Oracle的游标?

oracle中游标的使用?

oracle游标怎么使用?创建完了 怎么用?

oracle游标的使用