我尝试搜索引擎。这样的场景;我有一个表,它包含文本上下文,我正在根据我的查询获取一些合适的记录然后我想在运行时动态创建的表上传输这个创建的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;
答案 0 :(得分:1)
DBMS_SQL.NUMBER_TABLE
是associative 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
中加入b
到select
,以获得相同的结果:
select a.<columns> ...
from a
join b on b.a_id = a.a_id
where length(b.b_date) > 4;