Oracle прочитал n-й столбец с помощью курсора - PullRequest
2 голосов
/ 16 июля 2010

Могу ли я прочитать данные столбца в курсоре, дающем индекс столбца?

спасибо ...


Из комментариев спрашивающего: «Мне нужно создать общую процедурукоторый будет читать таблицу или представление (имя представления или таблицы является аргументом процедуры) и шифровать данные в столбце, а затем записывать зашифрованные данные в файл ОС. "

Ответы [ 2 ]

3 голосов
/ 19 июля 2010

Это должно дать вам преимущество.Просто вставьте свой код шифрования для нужного номера столбца.Я использовал VARCHAR везде.Если вам нужны даты и числа (или более экзотические типы данных), вам нужно будет обработать преобразование.

1 голос
/ 20 июля 2010

Дополнительный ответ для CLOB.Более простой код, поскольку я жестко закодировал имя таблицы / столбца.Основное отличие состоит в том, что v_line теперь является CLOB и что последний параметр (длина) удаляется из вызова DEFINE_COLUMN, поскольку он относится только к VARCHAR2.

Если вы работаете с очень большими CLOB (например, 10 сили 100s MB плюс), тогда я могу предвидеть другие проблемы (память, производительность ...).

create or replace function clob_dump
return tab_char_4000 AUTHID CURRENT_USER pipelined is
  v_line      clob;
  v_col_cnt   INTEGER;
  v_ind       NUMBER;
  rec_tab     dbms_sql.desc_tab;
  v_cursor    NUMBER;
begin
  --
  -- Identify the columns in the target and build the new query
  --
  v_cursor := dbms_sql.open_cursor;
  dbms_sql.parse(v_cursor, 'select sql_fulltext from gm_c where rownum <= 5', dbms_sql.native);
  dbms_sql.describe_columns(v_cursor, v_col_cnt, rec_tab);
  --
  FOR v_pos in 1..rec_tab.LAST LOOP
    v_line := rec_tab(v_pos).col_name;
    dbms_sql.define_column( v_cursor, v_pos, v_line);
  END LOOP;
  v_ind := dbms_sql.execute( v_cursor );
  --
  -- Fetch each row from the result set
  --
  LOOP
    v_ind := DBMS_SQL.FETCH_ROWS( v_cursor );
    EXIT WHEN v_ind = 0;
    pipe row( '=============================================================');
    --
    -- Go through each column and display it
    --
    FOR v_col_seq IN 1 .. rec_tab.COUNT LOOP
      -- Get the value
      dbms_sql.column_value( v_cursor, v_col_seq, v_line );
      pipe row( rpad(rec_tab(v_col_seq).col_name,35)||'>'||substr(v_line,1,100));
    END LOOP;
  END LOOP;
  return;
end clob_dump;
/

select * from table(clob_dump);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...