Oracle 19c与12c SQL*Plus中VARCHAR2默认格式差异及恢复咨询
我们正将数据库从12c升级至19c,同步升级Oracle客户端后,部分通过SQL*Plus生成报表的任务出现格式问题:VARCHAR2字段的默认输出格式发生变化。
测试表及数据定义如下:
create table tmp_test (test_id varchar2(9) , test_name varchar2(30)); insert into tmp_test (TEST_ID, TEST_NAME) values ('123456789', 'test name 123456789'); insert into tmp_test (TEST_ID, TEST_NAME) values ('987654321', 'test name 987654321'); commit;
在12c SQL*Plus中,默认输出为列横向排列:
SQL*Plus: Release 12.2.0.1.0 Production on Mon Oct 16 13:17:44 2023 Copyright (c) 1982, 2016, Oracle. All rights reserved. Last Successful login time: Mon Oct 16 2023 13:08:53 +01:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production SQL> select * from tmp_test; TEST_ID TEST_NAME --------- ------------------------------ 123456789 test name 123456789 987654321 test name 987654321 SQL>
但升级到19c SQL*Plus后,默认输出变为列纵向单独排列:
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 16 13:25:59 2023 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Last Successful login time: Mon Oct 16 2023 13:17:44 +01:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.19.0.0.0 SQL> select * from tmp_test; TEST_ID ------------------------------------ TEST_NAME -------------------------------------------------------------------------------- 123456789 test name 123456789 987654321 test name 987654321 SQL>
咨询以下两个问题:
- 能否无需添加显式列格式化(如
column test_id format a9)将格式恢复为12c版本? - 该格式变更是否有官方文档记录?
1. 无需显式列格式化恢复12c输出格式
可以通过调整SQL*Plus的全局参数实现,有两种常用方式:
调整
LINESIZE参数:
19c SQL*Plus默认的列显示宽度有所增大,当所有列的总宽度(含列间分隔符)超过LINESIZE的默认值(通常为80)时,会自动换行成纵向排列。只需设置足够大的LINESIZE值,确保列总宽度在范围内即可:SET LINESIZE 120设置后重新执行查询,输出会恢复为12c的横向排列格式。
设置
DEFAULTCOLWIDTH参数:
19c中SQL*Plus对VARCHAR2列的默认显示宽度计算方式发生变化,可通过DEFAULTCOLWIDTH指定全局默认列宽,让其匹配12c的行为:SET DEFAULTCOLWIDTH 30该参数会让所有VARCHAR2列的默认显示宽度不超过指定值(若列定义长度小于该值,则使用列定义长度),从而避免总宽度超出
LINESIZE导致换行。
2. 官方文档记录
该格式变更属于SQLPlus在18c版本引入的行为调整,后续19c沿用了此特性。相关内容可在《Oracle Database SQLPlus User's Guide and Reference》的新特性章节中找到,文档明确说明了SQL*Plus对VARCHAR2列默认显示宽度的计算逻辑变更,以及DEFAULTCOLWIDTH等参数的作用调整。
内容的提问来源于stack exchange,提问作者StefanG

