FAIRYFAR-INTERNAL
 
  FAIRYFAR-INTERNAL  |  SITEMAP  |  ABOUT-ME  |  HOME  
您的足迹: Oracle sqlplus按列显示
Oracle sqlplus按列显示

正文

PostgreSQLpsql客户端提供\x元命令,可以按列(扩展)显示查询结果,例如:

snippet.sql
postgres=# SELECT * FROM aot;
 slot_time | slot_count |  event  | event_count | event_rate 
-----------+------------+---------+-------------+------------
 21:00:00  |          3 | Event 1 |           2 |      33.33
 21:01:00  |          4 | Event 1 |           4 |      33.34
(2 ROWS)
 
# 切换到扩展显示模式
seaboxsql=# \x
Expanded display IS ON.
seaboxsql=# SELECT * FROM aot;
-[ RECORD 1 ]---------
slot_time   | 21:00:00
slot_count  | 3
event       | Event 1
event_count | 2
event_rate  | 33.33
-[ RECORD 2 ]---------
slot_time   | 21:01:00
slot_count  | 4
event       | Event 1
event_count | 4
event_rate  | 33.34

同样地,MySQL客户端也提供\G类似元命令。

然而,Oraclesqlplus没有提供此种显示模式。我们可以通过间接方式实现。

定义一个过程:

snippet.sql
CREATE OR REPLACE PROCEDURE print_table( p_query IN varchar2 )
AUTHID CURRENT_USER
IS
	l_theCursor INTEGER DEFAULT dbms_sql.open_cursor;
	l_columnValue varchar2(4000);
	l_status INTEGER;
	l_descTbl dbms_sql.desc_tab;
	l_colCnt NUMBER;
BEGIN
	EXECUTE immediate
	'alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss'' ';
 
	dbms_sql.parse( l_theCursor, p_query, dbms_sql.native );
	dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );
 
	FOR i IN 1 .. l_colCnt loop
		dbms_sql.define_column(l_theCursor, i, l_columnValue, 4000);
	END loop;
 
	l_status := dbms_sql.execute(l_theCursor);
 
	while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) 
	loop
		FOR i IN 1 .. l_colCnt loop
			dbms_sql.column_value
			( l_theCursor, i, l_columnValue );
			dbms_output.put_line
			( rpad( l_descTbl(i).col_name, 30 )
			|| ': ' || 
			l_columnValue );
		END loop;
		dbms_output.put_line( '-----------------' );
	END loop;
	EXECUTE immediate 'alter session set nls_date_format=''dd-MON-rr'' ';
 
	exception
		WHEN others THEN
		EXECUTE immediate 'alter session set nls_date_format=''dd-MON-rr'' ';
		raise;
END;
/

使用过程:

snippet.sql
SQL> SET serveroutput ON;
SQL> EXEC print_table('select * from v$database');
DBID                          : 2867884909
NAME                          : ORCLCDB
CREATED                       : 2022-02-16 17:12:13
RESETLOGS_CHANGE#             : 1920977
RESETLOGS_TIME                : 2022-02-16 17:12:16
PRIOR_RESETLOGS_CHANGE#       : 1
……
-----------------
 
PL/SQL PROCEDURE successfully completed.

参考



打赏作者以资鼓励:
移动端扫码阅读:
目录: