Определение JOIN-курсора и соответствующего типа строки (с наименьшим кодом) - PullRequest
1 голос
/ 18 октября 2011

В настоящее время я работаю с пакетным процессом PL / SQL в Oracle, в котором мне нужно обрабатывать данные, извлеченные из файла.

В настоящее время мне удалось сохранить эту информацию в нескольких временных таблицах, но онитакже ссылка на постоянные таблицы.

Для моей процедуры PL / SQL я определил курсор следующим образом:

CURSOR myCursor is
SELECT A.field1, A.field2..... C.fieldN
FROM A JOIN .... JOIN C;

К этому курсору я применю оператор FOR ALL,Мой алгоритм требует, чтобы я провел некоторую проверку данных.Разные функции проверки требуют различного подмножества данных на входе, которые я могу найти в типе записи, возвращаемой курсором.

Для простоты кодирования я бы хотел, чтобы ВСЕ функции проверки принимались и возвращались (втораяфактически возможно по спецификациям системы) соответственно аргумент того же типа.

Т.е..

FUNCTION CheckA(param1 IN IN_RECORD_TYPE) RETURN VALIDATION_OUTCOME;
FUNCTION CheckB(param1 IN IN_RECORD_TYPE) RETURN VALIDATION_OUTCOME;
FUNCTION CheckC(param1 IN IN_RECORD_TYPE) RETURN VALIDATION_OUTCOME;
FUNCTION CheckC(param1 IN IN_RECORD_TYPE) RETURN VALIDATION_OUTCOME;

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

Мой прямой вопрос

Как мне объявить IN_RECORD_TYPE, чтобы сопоставить тип строки, возвращаемый указанным выше курсором, с наименьшим кодом?

Я знаю, что могу определить пользовательский тип записи, соответствующий результату курсора, затем построить поле входного объекта по полю.Но это не кажется хорошей практикой.CURSOR s не определяют свойство %TYPE.

Что я могу для этого сделать?

1 Ответ

3 голосов
/ 18 октября 2011

Вы должны иметь возможность просто передать запись, используя курсор ROWTYPE. Вам не нужно объявлять отдельный тип записи. Что-то вроде

SQL> ed
Wrote file afiedt.buf

  1  create or replace package test_pkg
  2  as
  3    cursor c1
  4        is select e.ename,
  5                  d.dname
  6             from emp e,
  7                  dept d
  8            where e.deptno = d.deptno;
  9    procedure p1( p_arg IN c1%rowtype );
 10    procedure p2( p_arg IN c1%rowtype );
 11* end;
 12  /

Package created.
...