今天要把'1,2,3,4' 这样的字符串变成 selelct .... in (1,2,3,4) 这样的条件, 一开始想到用数组, 发现不能直接 select .... in (数组), 但是通过google 后, 知道了oracle 有一个 table 函数, 这个函数可以把 table 类型的数据展现出来.
table 函数本人刚刚接触, 用得不多, 感觉select * from table(my_table_type) 类似于 select * from (select a,b,c from my_table) 一样, 不同的地方是my_table_type 的数据是可以自己编辑的, 不用从具体哪个表中获取, 效率方面本人没有测试过.
在plsql 块中定义的 table 类型变量, 无法直接用 table 函数, 会报 ora-00642错误:local collection types not allowed in SQL statements.
例子:
1. 建立一个table 类型(除了这种嵌套表类型还有集合类型是 varray 和 record, 但是只有table 类型可以用于 table函数, 这三种集合都有很多内建函数).
create type emp_array is table of varchar2(200); --建立在当前用户下面的
2. 在plsql 块, 存储过程或方法中定义一个 emp_array 变量, 在执行代码中给其赋值(赋值方式需根据自己的实际情况来)
定义: v_emp_array emp_array;
赋值: v_emp_array:=emp_array('219462979','219462979','C','D','E','F','G');
DBMS_OUTPUT.put_line('Length:'||v_emp_array.count);
3. 用于in 中
select * from emp p where to_char(p.id) in (select * from table(v_emp_array));
参考了lne818 的oracle table() 函数用法, 发现有 the() 函数 可以用于collection类型如: table 和 varray (测试table 和 varray可行, 没测试record), 不过要借助dual 表.
如 select * from the(select v_emp_array from dual);
参考了这个:
http://www.club-oracle.com/articles/varray-in-pl-sql-507/
lne818 的文章: oracle table()函数用法