1

PLSQLプロシージャに次の構造があるとします:

...
for rec in
  (
  select a, b, c from t;
  )
loop
  process_record(rec);
end loop;
...

procedure process_record(p_rec in ???)
...

弱く型付けされたカーソルのレコードである rec を処理用のプロシージャに渡すにはどうすればよいですか。このタイプのレコードにカーソルとタイプを定義したくありません。これは可能ですか?

TIAゴールド

4

2 に答える 2

0

Oracleに入力の構造を伝えるために、カーソルまたはタイプ(どちらも必要ありません)を定義する必要があります(ルートをたどったり、AnyData / AnyTypeアプローチを定義したい場合を除く)。

例えば

declare
  cursor my_template
  is
    select a,b,c from t;


  procedure process_record(p_rec in my_template%rowtype)
      is
  begin
   null;
  end;
begin
for rec in
  (
  select a, b, c from t
  )
loop
  process_record(rec);
end loop;
end;
/
于 2012-11-12T17:32:26.400 に答える
0

私はそれを行う簡単な方法を知りません(そして、それを見ると最も驚くでしょう)が、回避策があります:

タイプとして XMLType を使用します。

declare

begin
  for rec in (select xmlelement("p_rec", xmlforest(a, b, c)) r from t) loop
    process_record(rec.r);
  end loop;
end; 

...

create or replace procedure process_record(p_rec in XMLtype) as

BEGIN
dbms_output.put(p_rec.extract('//A/text()').getstringval() || ',');
dbms_output.put(p_rec.extract('//B/text()').getstringval() || ',');
dbms_output.put_line(p_rec.extract('//C/text()').getstringval());
END;

ところで、なぜそれをしたいのですか?

于 2012-11-12T17:32:36.260 に答える