【问题标题】:dbms_sql.number_table in IN statementIN 语句中的 dbms_sql.number_table
【发布时间】:2018-02-08 02:18:56
【问题描述】:

我已经声明了一个数字表,例如:

v_areas_hijas   dbms_sql.number_table;

我填满表格,然后我正在尝试这个比较:

  select 
  idarea
from areas 
where 
  IDAREAPADRE in v_areas_hijas;

但我得到了:

错误(45,22):PLS-00382:表达式类型错误

我应该怎么做那个 IN 语句?

编辑 1:使用“成员”

  select 
      idarea
    from areas 
    where 
      IDAREAPADRE member of v_areas_hijas;
  

我有这两个错误:

错误(45,29):PLS-00382:表达式类型错误

错误(45,29):PL/SQL:ORA-00932:不一致的数据类型预期 UDT 得到了 CHAR

AREAS表中,IDAREAIDAREAPADRENUMBER

【问题讨论】:

  • v_areas_hijas_tmp 的类型是什么?
  • @kfinity 同 v_areas_hijas: dbms_sql.number_table;

标签: oracle plsql


【解决方案1】:

在您的other question 中,v_areas_hijas 不是表格。如果它是 SQL 中定义的集合类型,您可以使用 member of 集合运算符:

select idarea bulk collect into v_areas_hijas_tmp 
from   areas 
where  idareapadre member of v_areas_hijas;

例如,使用预定义类型sys.dbms_debug_vc2coll(更多示例请查看all_coll_types),

declare 
    t_demo sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll('X','Y','Z');
    l_result integer;
begin
    select count(*) into l_result
    from   dual
    where  dummy member of t_demo;

    -- Or this:
    select count(*) into l_result
    from   dual
    where  dummy in
           ( select column_value from table(t_demo) );

    -- Or this:
    select count(*) into l_result
    from   dual d
           join table(t_demo) t on t.column_value = d.dummy;

    dbms_output.put_line(l_result);
end;

您可以在包中声明的嵌套表和可变数组类型上使用table() 运算符:

create or replace package demo
as
    type demo_collection_type is table of varchar2(1);
end demo;

然后

declare 
    t_demo demo.demo_collection_type := demo.demo_collection_type('X','Y','Z');
    l_result integer;
begin
    select count(*) into l_result
    from   dual
    where  dummy in
           ( select column_value from table(t_demo) t );

    dbms_output.put_line(l_result);

    -- Or:
    select count(*) into l_result
    from   dual d
           join table(t_demo) t on t.column_value = d.dummy;

    dbms_output.put_line(l_result);
end;

从 12.1 开始,您不能将 member of 用于 PL/SQL 包中声明的集合类型。

其中一些限制在 12.2 中被取消。

【讨论】:

  • 嗯,没有相同的 PLS-00382:表达式类型错误
  • idareapadre 的类型是什么?是数字吗?
  • 是的,它也是一个数字,但是:错误(45,29):PL/SQL:ORA-00932:tipos de dato 不一致:se esperaba UDT se ha obtenido CHAR
  • 我认为问题在于v_areas_hijas_tmp 不是idarea 的表。请向我们展示您的完整代码。
  • 好吧,看起来 UDT 错误是因为 dbms_sql.number_table 是“用户定义类型”——它是包的一部分——所以它的工作方式与常规集合不同。如果您创建自己的 SQL 类型(或使用预定义的类型,如 dbms_debug_vc2coll),此代码将正常工作。
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 2021-12-23
  • 2015-02-25
  • 2020-12-31
  • 2017-07-05
相关资源
最近更新 更多