Oracle使用游标读取第n列

时间:2010-07-16 12:07:04

标签: oracle cursor

我可以在游标中读取列数据,给出列的索引吗?

感谢...


来自提问者的评论: “我需要创建一个读取表或视图的通用过程(视图或表的名称是proc的参数)并加密列中的数据,然后将加密数据写入OS文件。”< / p>

2 个答案:

答案 0 :(得分:3)

这应该会给你一个良好的开端。 只需插入所需列号的加密代码即可。 我到处都使用过VARCHAR。如果你想要日期和数字(或更奇特的数据类型),那么你需要处理转换。

create or replace function qry_dump
  (p_tab_name in varchar2, p_rownum in number default 5)
return tab_char_4000 AUTHID CURRENT_USER pipelined is
  v_line      varchar2(2000);
  v_col_cnt   INTEGER;
  v_ind       NUMBER;
  rec_tab     dbms_sql.desc_tab;
  v_tab       dbms_sql.varchar2a;
  v_temp      VARCHAR2(32000);
  v_cursor    NUMBER;
  v_clause    VARCHAR2(200);
begin
  --
  -- Initial values
  --  v_ind := 1;
  v_temp := 'select * from '||p_tab_name||' where rownum <= '||nvl(p_rownum,5);
  --
  -- Identify the columns in the target and build the new query
  --
  v_cursor := dbms_sql.open_cursor;
  dbms_sql.parse(v_cursor, v_temp, 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, 2000);
  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)||'>'||v_line);
    END LOOP;
  END LOOP;
  return;
end qry_dump;
/

select * from table(qry_dump('DEPT',3));

答案 1 :(得分:1)

CLOB的补充答案。 更简单的代码因为我已经硬编码了表/ column_name。 主要区别在于v_line现在是一个CLOB,并且最终参数(长度)从调用DEFINE_COLUMN中删除,因为它只与VARCHAR2相关。

如果您正在处理非常大的CLOB(例如10s或100s MB plus),那么我可以预见其他挑战(记忆,性能......)。

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);