在一个过程中使用plsql表

时间:2013-01-07 13:48:15

标签: oracle plsql procedure

我在oracle数据库9i中使用plsql 我有一个存储过程, 使用“数字表”的in参数称为数字。 我现在想要从表中选择所有行,其中名为:ID的列等于“数字”内的数字 就像我可以select * from table name where Id in (!,!,!,...)一样 谢谢您的帮助。

更新: 要清理一下, 我有一个名为numbers的用户定义类型, 数字定义为:数字表。 所以在程序中,我有 “数字P_array” 我需要select * from a table where Id is found in p_array

3 个答案:

答案 0 :(得分:2)

像这样?

SQL> create type numbers as table of number;
  2  /

Type created.

SQL> create table foo (id number) ;

Table created.

SQL> insert into foo select rownum from dual connect by level <= 10;

10 rows created.

SQL> select * from foo;

        ID
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

SQL> create procedure testnum(p_num in numbers)
  2  is
  3  begin
  4    for r_row in (select id
  5                    from foo f
  6                   where f.id in (select /*+ cardinality(t, 10) */ column_value
  7                                    from table(p_num) t))
  8    loop
  9      dbms_output.put_line(r_row.id);
 10    end loop;
 11  end;
 12  /

Procedure created.

SQL> set serverout  on
SQL> exec testnum(numbers(2, 6, 9));
2
6
9

基数提示用于告诉oracle大致有多少元素在你的表中。没有它,Oracle将假设大约8k行,这些行可能太高并导致计划中不需要的完整扫描。

如果您愿意,也可以直接加入。

for r_row in (select /*+ cardinality(t, 10) */ f.id
                from foo f
                     inner join table(p_num) t
                             on t.column_value = f.id)

答案 1 :(得分:1)

尝试以下方法: -

select * from tableName where id in (select c.column_value from table(cast(p_array as numbers)) c);

其中number是数字表

答案 2 :(得分:0)

SELECT * FROM A_TABLE WHERE ID IN (SELECT SAVED_NUMBERs FROM TABLE_NUMBER);

你是说这个吗?