oracle слабо типизированная запись в качестве параметра

Скажем, у меня есть эта конструкция в процедуре PLSQL:

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

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

Как передать rec, представляющую собой запись слабо типизированного курсора, процедуре обработки. Я не хочу определять курсор и тип для записи этого типа. Это возможно?

ТИА Золото


person gold finger    schedule 12.11.2012    source источник


Ответы (2)


вам нужно определить курсор или тип (оба не нужны), чтобы сообщить оракулу структуру ввода (если вы не хотите идти по маршруту или определять подход AnyData/AnyType.

eg

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;
/
person DazzaL    schedule 12.11.2012
comment
да, это обычный способ передачи TYPED записи. Я специально попросил способ избежать машинописных записей. Спасибо, в любом случае. - person gold finger; 12.11.2012
comment
правильно, поэтому я сказал, что единственный способ - ЛЮБЫЕ ДАННЫЕ / ЛЮБОЙ ТИП. но для этого много кода. разве вы не можете просто принять процедуру вместо sys_refcursor? - person DazzaL; 12.11.2012
comment
Нет. Существует центральная процедура, которая считывает записи с помощью цикла for..in(). На данный момент вся обработка записи выполняется в теле цикла. Тело стало очень большим и я хочу разбить его на несколько процедур - рефакторинг. Внутри цикла запись выглядит как нетипизированная запись. Я надеялся, что эту запись можно будет передать процедуре для обработки, а не использовать ее внутри тела цикла. - person gold finger; 13.11.2012

Я не знаю простого способа сделать это (и был бы очень удивлен, увидев его), но у меня есть обходной путь:

Используйте 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;

Кстати, почему вы хотите это сделать?

person A.B.Cade    schedule 12.11.2012
comment
Интересно, но я надеялся на подход, который позволит мне использовать rec.a непосредственно в процедуре process_record... Это немного сложно и, я думаю, медленно выполняется. Тем не менее, это правильный ответ (я не пробовал это сам). Спасибо большое. - person gold finger; 12.11.2012