# 正文 `PostgreSQL`的`psql`客户端提供`\x`元命令,可以按列(扩展)显示查询结果,例如: ```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`类似元命令。 然而,`Oracle`的`sqlplus`没有提供此种显示模式。我们可以通过间接方式实现。 定义一个过程: ```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; / ``` 使用过程: ```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. ``` # 参考 1. [print_table 实现 sqlplus 类似 mysql \G 及 psql \x 的功能](https://blog.csdn.net/ctypyb2002/article/details/107490215) 2. [re: prior posting on index - Ask TOM](https://asktom.oracle.com/ords/f?p=100:11:0::::P11_QUESTION_ID:1035431863958)