TO_CHAR типа Oracle PL / SQL TABLE - PullRequest
4 голосов
/ 07 июня 2011

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

DECLARE
  TYPE T IS TABLE OF MY_TABLE%ROWTYPE INDEX BY PLS_INTEGER;
  V T;

BEGIN
  -- ..

  -- Here, I'd like to dbms_output V's contents, which of course doesn't compile
  FOR i IN V.FIRST .. V.LAST LOOP
    dbms_output.put_line(V(i));
  END LOOP;

  -- I want to omit doing this:
  FOR i IN V.FIRST .. V.LAST LOOP
    dbms_output.put_line(V(i).ID || ',' || V(i).AMOUNT ...);
  END LOOP;

END;

Может ли это быть достигнуто просто?Причина, по которой я спрашиваю, состоит в том, что мне лень писать этот код отладки снова и снова, и я хотел бы использовать его с любым типом таблицы.

1 Ответ

6 голосов
/ 07 июня 2011

хорошо, извините, это не завершено, но для продолжения работы с @Lukas вот что у меня есть:

Во-первых, вместо того, чтобы пытаться создавать любые типы данных / типов, я попытался использовать XML, извлеченный из курсора ... странно, но его обобщенно:

CREATE OR REPLACE procedure printCur(in_cursor IN sys_refcursor) IS
begin

    FOR c IN (SELECT ROWNUM rn,
                    t2.COLUMN_VALUE.getrootelement () NAME,
                    EXTRACTVALUE (t2.COLUMN_VALUE, 'node()') VALUE
               FROM TABLE (XMLSEQUENCE (in_cursor)) t,
                    TABLE (XMLSEQUENCE (EXTRACT (COLUMN_VALUE, '/ROW/node()'))) t2
               order by 1)

   LOOP
      DBMS_OUTPUT.put_line (c.NAME || ': ' || c.VALUE);
   END LOOP;

exception
    when others then raise;
end;
/

Теперь, чтобы вызвать его, вам нужен курсор, поэтому я попытался привести к курсору в pl / sql, что-то вроде:

open v_cur for select * from table(cast(v_tab as tab_type));

Но в зависимости от того, как определен v_tab, это может вызывать или не вызывать проблемы при приведении pl / sql (использование% rowtype в определении вложенной таблицы может вызвать проблемы).

В любом случае, вы можете развить это или уточнить, как вам нравится. (и, возможно, использовать xmltable ...)

Надеюсь, это поможет

...