1

Oracleデータベース9iでplsqlを使用しています。ストアドプロシージャがあり、数値と呼ばれる「数値のテーブル」のinパラメーターがあります。IDという名前の列が「数字」内の数字と等しいテーブルからすべての行を選択したいのと同じようにselect * from table name where Id in (!,!,!,...) 、助けてくれてありがとう。

更新: 明確にするために、数字という名前のユーザー定義型があります。数値が定義されています: 数値のテーブル。したがって、プロシージャの宣言には「P_array in numbers」が必要ですselect * from a table where Id is found in p_array

4

3 に答える 3

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 は最大 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)
于 2013-01-07T15:23:14.440 に答える
1

以下を試してください:-

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

ここで、数値は数値の表です

于 2013-01-07T14:54:31.950 に答える
0
SELECT * FROM A_TABLE WHERE ID IN (SELECT SAVED_NUMBERs FROM TABLE_NUMBER);

これのことですか?

于 2013-01-07T13:51:13.813 に答える