|
多谢各位, 今天折腾了2个多小时,也基本实现了, 但是上来看到NEWKID大师已经写好了,楼上的朋友已经也帮忙找到TOM大师的print_table了. 满满的感动... 我些的代码自然不能和NEWKID大师的作品相比, 但是这里也贴出来吧, 别喷我 大师的作品是要留着慢慢消化的......
CREATE OR REPLACE PROCEDURE get_record_incol(SQLSTR VARCHAR2)
IS
v_cursor NUMBER;
exec_result NUMBER;
col_cnt PLS_INTEGER;
rec_tab dbms_sql.desc_tab;
record_str varchar2(4000) := '';
row_cnt number := 0;
V_VARCHAR2 VARCHAR2(4000);
V_NVARCHAR2 NVARCHAR2(4000);
V_NUMBER NUMBER;
V_DATE DATE;
V_CHAR CHAR(4000);
V_BLOB BLOB;
V_CLOB CLOB;
V_BINARY_DOUBLE BINARY_DOUBLE;
V_BINARY_FLOAT BINARY_FLOAT;
V_LONG LONG;
V_NCLOB NCLOB;
V_RAW RAW(4000);
V_TIMESTAMP TIMESTAMP(6);
V_TIMESTAMP_ZONE_LOCALTIME TIMESTAMP(6) WITH LOCAL TIME ZONE;
V_TIMESTAMP_ZONE_TIME TIMESTAMP(6) WITH TIME ZONE;
V_INTERVAL_DAY2SEC INTERVAL DAY(2) TO SECOND(6);
V_INTERVAL_YEAR2MON INTERVAL YEAR(2) TO MONTH;
BEGIN
v_cursor:= dbms_sql.open_cursor;
dbms_sql.parse(v_cursor, SQLSTR, dbms_sql.NATIVE);
--dbms_sql.bind_variable(v_cursor, ':deptno', 20);
exec_result := dbms_sql.execute(v_cursor);
/*查看列名和类型*/
dbms_sql.describe_columns(v_cursor, col_cnt, rec_tab);
for i in 1 .. rec_tab.count loop
case rec_tab(i).col_type
when 1 then /* VARCHAR2 or NVARCHAR2 */
dbms_sql.define_column(v_cursor, i, V_VARCHAR2, 4000);
when 2 then /* NUMBER */
dbms_sql.define_column(v_cursor,i, V_NUMBER);
when 12 then /* DATE */
dbms_sql.define_column(v_cursor,i, V_DATE);
when 96 then /* CHAR */
dbms_sql.define_column(v_cursor,i, V_CHAR, 4000);
when 113 then /* BLOB */
dbms_sql.define_column(v_cursor,i, V_BLOB);
when 112 then /* CLOB NCLOB*/
dbms_sql.define_column(v_cursor,i, V_CLOB, 4000);
when 101 then /* BINARY_DOUBLE */
dbms_sql.define_column(v_cursor,i, V_BINARY_DOUBLE);
when 100 then /* BINARY_FLOAT */
dbms_sql.define_column(v_cursor,i, V_BINARY_FLOAT);
when 8 then /* LONG */
dbms_sql.define_column(v_cursor,i, V_LONG);
when 23 then /* RAW */
dbms_sql.define_column(v_cursor,i, V_RAW);
when 180 then /* TIMESTAMP */
dbms_sql.define_column(v_cursor,i, V_TIMESTAMP);
when 231 then /* TIMESTAMP(6) WITH LOCAL TIME ZONE */
dbms_sql.define_column(v_cursor,i, V_TIMESTAMP_ZONE_LOCALTIME);
when 181 then /* TIMESTAMP(6) WITH TIME ZONE */
dbms_sql.define_column(v_cursor,i, V_TIMESTAMP_ZONE_TIME);
when 183 then /* INTERVAL DAY(2) TO SECOND(6)*/
dbms_sql.define_column(v_cursor,i, V_INTERVAL_DAY2SEC);
when 182 then /* INTERVAL YEAR(2) TO MONTH*/
dbms_sql.define_column(v_cursor,i, V_INTERVAL_YEAR2MON);
else
dbms_sql.define_column(v_cursor, i, V_VARCHAR2,4000);
end case;
end loop;
/*输出列的值*/
LOOP
EXIT WHEN dbms_sql.fetch_rows(v_cursor)<=0; /*如果游标到达末尾,返回0*/
row_cnt := row_cnt + 1;
record_str := '';
for i in 1 .. rec_tab.count loop
case rec_tab(i).col_type
when 1 then /* VARCHAR2 or NVARCHAR2 */
dbms_sql.column_value(v_cursor,i, V_VARCHAR2);
record_str := record_str || rec_tab(i).col_name || ': ' || TRIM(V_VARCHAR2) || chr(13) || chr(10);
when 2 then /* NUMBER */
dbms_sql.column_value(v_cursor,i, V_NUMBER);
record_str := record_str || rec_tab(i).col_name || ': ' || to_char(V_NUMBER) || chr(13) || chr(10);
when 12 then /* DATE */
dbms_sql.column_value(v_cursor,i, V_DATE);
record_str := record_str || rec_tab(i).col_name || ': ' || to_char(V_DATE,'YYYY-MM-DD HH24:MI:SS') || chr(13) || chr(10);
when 96 then /* CHAR */
dbms_sql.column_value(v_cursor,i, V_CHAR);
record_str := record_str || rec_tab(i).col_name || ': ' || TRIM(V_CHAR) || chr(13) || chr(10);
when 113 then /* BLOB */
--dbms_sql.column_value(v_cursor,i, V_BLOB);
record_str := record_str || rec_tab(i).col_name || ': ' || 'This is a Blob Field,Ingore...' || chr(13) || chr(10);
when 112 then /* CLOB NCLOB*/
dbms_sql.column_value(v_cursor,i, V_CLOB);
record_str := record_str || rec_tab(i).col_name || ': ' || substr(V_CLOB,1,60) || chr(13) || chr(10);
when 101 then /* BINARY_DOUBLE */
dbms_sql.column_value(v_cursor,i, V_BINARY_DOUBLE);
record_str := record_str || rec_tab(i).col_name || ': ' || to_char(V_BINARY_DOUBLE) || chr(13) || chr(10);
when 100 then /* BINARY_FLOAT */
dbms_sql.column_value(v_cursor,i, V_BINARY_FLOAT);
record_str := record_str || rec_tab(i).col_name || ': ' || to_char(V_BINARY_FLOAT) || chr(13) || chr(10);
when 8 then /* LONG */
--dbms_sql.column_value(v_cursor,i, V_LONG);
record_str := record_str || rec_tab(i).col_name || ': ' || 'This is a Long Field,Ingore...' || chr(13) || chr(10);
when 23 then /* RAW */
--dbms_sql.column_value(v_cursor,i, V_RAW);
record_str := record_str || rec_tab(i).col_name || ': ' || 'This is a RAW Field,Ingore...' || chr(13) || chr(10);
when 180 then /* TIMESTAMP */
dbms_sql.column_value(v_cursor,i, V_TIMESTAMP);
record_str := record_str || rec_tab(i).col_name || ': ' || to_char(V_DATE,'YYYY-MM-DD HH24:MI:SS:FF3') || chr(13) || chr(10);
when 231 then /* TIMESTAMP(6) WITH LOCAL TIME ZONE */
dbms_sql.column_value(v_cursor,i, V_TIMESTAMP_ZONE_LOCALTIME);
record_str := record_str || rec_tab(i).col_name || ': ' || to_char(V_TIMESTAMP_ZONE_LOCALTIME,'YYYY-MM-DD HH24:MI:SS:FF') || chr(13) || chr(10);
when 181 then /* TIMESTAMP(6) WITH TIME ZONE */
dbms_sql.column_value(v_cursor,i, V_TIMESTAMP_ZONE_TIME);
record_str := record_str || rec_tab(i).col_name || ': ' || to_char(V_TIMESTAMP_ZONE_TIME,'YYYY-MM-DD HH24:MI:SS:FF') || chr(13) || chr(10);
when 183 then /* INTERVAL DAY(2) TO SECOND(6)*/
dbms_sql.column_value(v_cursor,i, V_INTERVAL_DAY2SEC);
record_str := record_str || rec_tab(i).col_name || ': ' || V_INTERVAL_DAY2SEC || chr(13) || chr(10);
when 182 then /* INTERVAL YEAR(2) TO MONTH*/
dbms_sql.column_value(v_cursor,i, V_INTERVAL_YEAR2MON);
record_str := record_str || rec_tab(i).col_name || ': ' || V_INTERVAL_YEAR2MON || chr(13) || chr(10);
else
record_str := record_str || rec_tab(i).col_name || ' have not recognize field. the col_type value is : ' || rec_tab(i).col_type || chr(13) || chr(10);
end case;
end loop;
dbms_output.put_line(record_str);
dbms_output.put_line('----------------------------------------------------------');
END LOOP;
dbms_sql.close_cursor(v_cursor);
dbms_output.put_line(row_cnt || ' rows selected.');
return;
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
dbms_sql.close_cursor(v_cursor);
end;
/
set lines 4000
set serveroutput on
exec GET_RECORD_INCOL('select * from employees where department_id = 30');
|
|