2015-06-29 3 views
0

Я пытаюсь форматировать данные, возвращаемые с помощью курсора в JSON, путем циклического обращения к записям и столбцам без явного вызова каждого имени столбца. Из того, что я исследовал, это очень хорошо, может быть, не простая задача или, по крайней мере, так просто, как я пытаюсь это сделать. Мне интересно, попробовал ли кто-нибудь другой подобный подход, и если им повезло.Вложенные петли таблицы для форматирования данных, PL/SQL

declare 
    type type_cur_tab is table of employees%rowtype 
    index by PLS_integer; 

    type type_col_tab is table of varchar2(1000) 
    index by binary_integer; 

    tbl_rec type_cur_tab; 
    tbl_col type_col_tab; 
begin 
    select * BULK COLLECT INTO tbl_rec 
     from employees; 

    select column_name BULK COLLECT INTO tbl_col 
     from all_tab_columns 
     where UPPER(table_name) = 'EMPLOYEES'; 

    for i IN 1..tbl_rec.COUNT Loop 
     for j IN 1..tbl_col.count Loop 
      dbms_output.put_line(tbl_rec(i).tbl_col(j)); 
     end loop; 
    end loop; 
end; 

Он выдает сообщение об ошибке «tbl_col». Я уверен, что это bc, он ищет 'tbl_col', указанный внутри 'tbl_rec'. Любая помощь приветствуется.

ПРИМЕЧАНИЕ. Я знаю о встроенном преобразовании JSON, но мне не удалось получить его так быстро, как хотелось бы, поэтому я пытаюсь выполнить цикл и добавить соответствующее форматирование по пути ,

+0

Вы комбинируете метаданные (ALL_TAB_COLUMNS) с данными приложения (СОТРУДНИКИ). Вы можете сделать это только с помощью динамического программирования, что будет сложно с PL/SQL, как это. Также очень маловероятно, что ваш ручной код будет быстрее, чем обычные библиотеки Oracle. Поэтому, вероятно, вы должны опубликовать свою встроенную программу здесь и спросить людей, может ли * этот * быть улучшен. – APC

ответ

0

Невозможно указать поле tbl_rec (i) таким образом.

Попробуйте это:

declare 
    v_cur sys_refcursor; 
    col_cnt number; 
    desc_t dbms_sql.desc_tab; 
    c number; 
    vVarchar varchar2(32000); 
    vNumber number;  
    vDate date;  
    v_result clob:=''; 
    rn number:=0; 
begin 

    --Any sql query or pass v_cur as input parameter in function on procedure 
    open v_cur for 
    select * from dual; 
    -------- 
    c:=dbms_sql.to_cursor_number(v_cur); 

    dbms_sql.describe_columns(c => c, col_cnt => col_cnt, desc_t => desc_t); 
    for i in 1 .. col_cnt 
     loop 
      case desc_t(i).col_type 
       when dbms_types.TYPECODE_DATE then 
        dbms_sql.define_column(c, i ,vDate); 
       when dbms_types.TYPECODE_NUMBER then 
        dbms_sql.define_column(c, i ,vNumber); 
       else 
        dbms_sql.define_column(c, i ,vVarchar,32000); 
      end case; 
     end loop; 

    v_result:='{"rows":{ "row": ['; 

    while (dbms_sql.fetch_rows(c)>0) 
     loop 
      if rn > 1 then v_result:=v_result||','; end if; 
     v_result:=v_result||'{'; 
      for i in 1 .. col_cnt 
       loop 
       if (i>1) then v_result:=v_result||','; end if; 
       case desc_t(i).col_type 
        --Date 
        when dbms_types.typecode_date then 
         dbms_sql.column_value(c,i,vDate); 
         v_result:=v_result||' "'||desc_t(i).col_name||'" :"'||to_char(vDate,'dd.mm.yyyy hh24:mi')||'"'; 
        --Number 
        when dbms_types.typecode_number then 
         dbms_sql.column_value(c,i,vNumber); 
         v_result:=v_result||' "'||desc_t(i).col_name||'" :"'||to_char(vNumber)||'"'; 
        --Varchar - default 
        else 
         dbms_sql.column_value(c,i,vVarchar); 
         v_result:=v_result||' "'||desc_t(i).col_name||'" :"'||vVarchar||'"'; 
       end case; 

       end loop; 
      v_result:=v_result||'}';    
     end loop; 
     v_result:=v_result||']}}'; 
     dbms_output.put_line (v_result); 
end; 

Кроме того, вы можете создать XML из реф курсора с пакетом DBMS_XMLGEN, а затем перевести XML в JSON с преобразованием XSLT.

+0

Это именно то, что я искал, к сожалению, медленнее, чем преобразование XML-JSON. Но возможность прокручивать таблицу без явного вызова столбца была тем, чем я был. В будущем я, вероятно, опубликую конкретный вопрос относительно правдоподобия генерации строки JSON, а не использования метода XML/xslt с точки зрения производительности. – Brian

Смежные вопросы