我可以读取游标中的列数据给出列的索引吗?Oracle使用游标读取第n列
感谢...
从提问者的评论: “我需要创建一个通用的过程,它会读取表或视图(视图或表的名称是PROC的说法)并加密列中的数据,然后将加密数据写入OS文件。“
我可以读取游标中的列数据给出列的索引吗?Oracle使用游标读取第n列
感谢...
从提问者的评论: “我需要创建一个通用的过程,它会读取表或视图(视图或表的名称是PROC的说法)并加密列中的数据,然后将加密数据写入OS文件。“
这应该会给你一个良好的开端。 只需插入您想要的列号的加密代码即可。 我到处都使用了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));
嗨,感谢您的回答,您的代码与我的代码非常相似。但是我有一个关于检索数据大小的问题。我将列定义为“',并给出了4096的长度。但是如果列是CLOB,该怎么办?我猜你的代码在这一点上也爆发了。当我尝试将columns_definition数据类型更改为CLOB时,出现了一些错误,如“期望的数字有日期”有什么想法? – mehmet6parmak 2010-07-19 07:07:21
CLOBs的附加答案。 更简单的代码,因为我硬编码了表/列名。 主要区别在于v_line现在是一个CLOB,并且最后一个参数(长度)从调用中删除到DEFINE_COLUMN,因为它只与VARCHAR2相关。
如果您在处理非常大的CLOB(例如10或100 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);
你是什么意思,像“从7选择emp”获得第7列?如果是的话答案是“否”。 – 2010-07-16 12:13:12
不,有没有像cursor.col_data(2)这样的方法?其中2是第二列的索引。我不知道列的名称,我怎么读? – mehmet6parmak 2010-07-16 12:15:31
请给我们一个你的代码的例子... – Tim 2010-07-16 12:19:33