0

我尝试使用搜索引擎。这样的场景;我有一个包含文本上下文的表,并且我正在根据我的查询获取一些适合的记录,然后我想将这个建立的 id 文本传输到在运行时动态创建的表上。我的sql代码如下但是这个错误

"expression is of wrong type"

SQL

declare
  v_table dbms_sql.number_table;
begin
  select a_id bulk collect into v_table from (select a_id from b where length(b_data) > 4);

  select * from a where a_id in v_table;
end;
4

1 回答 1

1

DBMS_SQL.NUMBER_TABLE是一个关联数组

与数据库表不同,关联数组:

  • 不需要磁盘空间或网络操作
  • 无法使用 DML 语句进行操作

您可以select into使用关联数组,但不能将其用作select.

您可以select into使用嵌套表,但如果在块中声明类型,您仍然不能使用它,select因为它将是在 SQL 语句中无效的 PL/SQL 类型。

您将需要在 SQL 中定义的嵌套表类型(即不在 PL/SQL 中)来实现这一点。有一个内置类型使它更容易,但您可以定义自己的:

declare
  v_table sys.odcinumberlist;
  v_table2 sys.odcinumberlist;
begin
  select a_id bulk collect into v_table
  from (select a_id from b where length(b_data) > 4);

  select a.a_id bulk collect into v_table2
  from table(v_table) vt
  join a on a.a_id = vt.column_value;
end;
/

anonymous block completed

你显示的第二个select不完整,所以我编了一个。您的第一个不需要嵌套select,可以简化为:

  select a_id bulk collect into v_table
  from b
  where length(b_data) > 4;

希望您在第二次之前对收藏有所了解select,否则这有点毫无意义;您可以在第二个中加入a以获得相同的结果:bselect

  select a.<columns> ...
  from a
  join b on b.a_id = a.a_id
  where length(b.b_date) > 4;
于 2014-01-24T10:34:57.110 回答