遍历列,您可以使用 dbms_sql 实用程序
这是一个例子
DROP TABLE ABC;
CREATE TABLE ABC (COL1, COL2, COL243) AS
SELECT '1001', 'LO SABIA', 'I KNEW IT' FROM DUAL UNION
SELECT '1002', 'NO IMPORTA','IT DOES NOT MATTER' FROM DUAL;
/
DECLARE
--
l_query VARCHAR2(4000) := 'Select * from abc';-------------replace table name to test
l_thecursor INTEGER DEFAULT dbms_sql.open_cursor;
l_columnvalue VARCHAR2(4000);
l_status INTEGER;
l_colcnt NUMBER := 0;
l_separator VARCHAR2(1) := '|';
l_desctbl dbms_sql.desc_tab;
l_insert_col_list VARCHAR2(3000);
l_insert_row_line VARCHAR2(3000);
l_insert_data_line VARCHAR2(3000);
TYPE numberstab IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
l_col_pad numberstab; --column size
--
BEGIN
dbms_sql.parse(l_thecursor, l_query, dbms_sql.native);
l_status := dbms_sql.execute(l_thecursor);
--
--describe columns
dbms_sql.describe_columns(l_thecursor, l_colcnt, l_desctbl);
FOR i IN 1 .. l_colcnt
LOOP
l_col_pad(i) := greatest(l_desctbl(i).col_name_len,
CASE l_desctbl(i).col_type
WHEN 12 --date
THEN
10
WHEN 2 THEN --number
6
ELSE
greatest(l_desctbl(i).col_max_len, 4)
END);
l_insert_col_list := l_insert_col_list || l_separator ||
lpad(l_desctbl(i).col_name, l_col_pad(i), ' ');
l_insert_row_line := l_insert_row_line || '+' || lpad('-', l_col_pad(i), '-');
dbms_sql.define_column(l_thecursor, i, l_columnvalue, 4000);
END LOOP;
--
l_insert_row_line := l_insert_row_line || '+';
dbms_output.put_line(l_insert_row_line);
dbms_output.put_line(l_insert_col_list || '|');
dbms_output.put_line(l_insert_row_line);
--
--ROWS
WHILE (dbms_sql.fetch_rows(l_thecursor)) > 0
LOOP
--COLUMNS
FOR i IN 1 .. l_colcnt
LOOP
dbms_sql.column_value(l_thecursor, i, l_columnvalue);--retrieve column value
--replace this section with the code you need
IF l_columnvalue IS NULL
THEN
l_insert_data_line := l_insert_data_line || l_separator ||
lpad('Null', l_col_pad(i), ' ');
ELSIF l_desctbl(i).col_type IN (12)
THEN
l_insert_data_line := l_insert_data_line || l_separator ||
lpad(to_char(to_date(l_columnvalue, 'dd-mon-yy'), 'yyyy-mm-dd'),
l_col_pad(i), ' ');
ELSE
l_insert_data_line := l_insert_data_line || l_separator ||
lpad(l_columnvalue, l_col_pad(i), ' ');
END IF;
END LOOP;
dbms_output.put_line(l_insert_data_line || '|');
l_insert_data_line := '';
--
END LOOP;
dbms_output.put_line(l_insert_row_line);
dbms_sql.close_cursor(l_thecursor);
END;
这将产生以下输出
+----+----------+------------------+
|COL1| COL2| COL243|
+----+----------+------------------+
|1001| LO SABIA| I KNEW IT|
|1002|NO IMPORTA|IT DOES NOT MATTER|
+----+----------+------------------+