在运行时创建Oracle动态表

时间:2014-01-24 08:26:50

标签: sql oracle plsql search-engine bulk-collect

我尝试搜索引擎。这样的场景;我有一个表,它包含文本上下文,我正在根据我的查询获取一些合适的记录然后我想在运行时动态创建的表上传输这个创建的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;

1 个答案:

答案 0 :(得分:1)

DBMS_SQL.NUMBER_TABLEassociative array

  

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

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

您可以select into关联数组,但不能将其用作select中的表格。

您可以select into使用nested table,但如果在您的块中声明类型,您仍然无法在select中使用它,因为它将是PL / SQL在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;