1

リストをパラメーターとして受け取るカーソルを実行する必要があります。私はこれを試しました:

declare

type array_t is table of varchar(50); -- //also tried varray(10) instead of table

cursor c_cursor (p_list array_t) is
select 
    field_1
from 
    table_1
where 
    field_2 in p_list;

a_list array_t;

begin
    a_list := array_t('aaa',
        'bbb',
        'cccc',
        'ddd');

    for v_cursor in c_cursor(a_list) loop
        dbms_output.put_line(v_cursor.field_1);
    end loop;
end;

次のエラーが表示されます

ORA-06550: line 11, column 21:
PLS-00642: local collection types not allowed in SQL statements

メソッドの使用について読みましたCREATE OR REPLACEが、この場合は使用できませんCREATE OR REPLACE(実際にはデータベースは読み取り専用です)。

可能な解決策はありますか?

4

3 に答える 3

2

pl / sqlタイプではなくSQLタイプが必要な場合は、table構文を使用して使用します。

作成できないとおっしゃっていますが、DBMS_OUTPUTに組み込まれているものを試してください。

SQL> create table table_1(field_1 varchar2(20), field_2 varchar2(20));

Table created.

SQL> insert into table_1 values ('test', 'aaa');

1 row created.

SQL> insert into table_1 values ('test2', 'cccc');

1 row created.

SQL> insert into table_1 values ('test3', 'x');

1 row created.

SQL> commit;

Commit complete.

SQL> set serverout on
SQL> declare
  2  cursor c_cursor (p_list sys.DBMSOUTPUT_LINESARRAY) is
  3  select /*+ cardinality(p, 10) */
  4      field_1
  5  from
  6      table_1 t
  7      inner join table(p_list) p
  8              on t.field_2 = p.column_value;
  9
 10  a_list sys.DBMSOUTPUT_LINESARRAY;
 11
 12  begin
 13      a_list := sys.DBMSOUTPUT_LINESARRAY('aaa',
 14          'bbb',
 15          'cccc',
 16          'ddd');
 17
 18      for v_cursor in c_cursor(a_list) loop
 19          dbms_output.put_line(v_cursor.field_1);
 20      end loop;
 21  end;
 22  /
test
test2

/*+ cardinality(p, 10) */ヒントは、配列に含まれる行の大まかな数をOracleに通知することです。代表的な番号を入力しないと、オラクルは配列に8k行が含まれていると想定し、計画が不十分になる可能性があります。

于 2013-01-09T11:53:21.697 に答える
1

typeクエリを使用して個別に作成する必要があります

CREATE OR REPLACE type array_t as table of varchar2(50);

その後お試しください。

于 2013-01-09T11:40:57.130 に答える
0

これは役立つかもしれません - Oracle PL/SQL:

DECLARE
  Type t_EmpNoArr IS VARRAY(20000) OF NUMBER(10) ;
  v_RetVal  t_EmpNoArr:= t_EmpNoArr();
  --
  FUNCTION retArray return t_EmpNoArr
  IS
    v_empnoArr t_EmpNoArr:= t_EmpNoArr();
  BEGIN
    FOR i IN ( SELECT empno FROM scott.emp )
    LOOP
      v_empnoArr.extend() ;
      v_empnoArr(v_empnoArr.count):= i.empno ;
    END LOOP;
  --
    FOR j IN 1..v_empnoArr.COUNT() LOOP
       DBMS_OUTPUT.PUT_LINE(v_empnoArr(j));
    END LOOP;
  --
  RETURN v_empnoArr;
 END retArray;
 --
 BEGIN
   v_RetVal:= retArray();
 END;
 /
于 2013-01-09T15:10:40.220 に答える