oracle 假脱机文件中的列宽是预期宽度的4倍

k4emjkb1  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(141)

我有一个脚本文件包含这样的脚本。

SET ECHO OFF
SET TERM OFF
SET LINESIZE 1500
SET PAGESIZE 0
SET TRIMSPOOL ON
SET COLSEP ''  
set headsep off
SET FEEDBACK OFF
SET HEADSETTING OFF
SET SHOW OFF
SPOOL D:\employee.TXT

SELECT RPAD(FIRSTNAME,20,' '),           
RPAD(LASTNAME,20,' '),               
RPAD(COMPANY,50,' '),                
RPAD(ADDRESS1,50,' '),           
RPAD(ADDRESS2,50,' '),           
RPAD(ADDRESS3,50,' '),           
RPAD(CITY,50,' '),               
RPAD(STATE,50,' ')              
FROM EmployeeDetails;
SPOOL OFF

EXIT;

上述脚本预计将生成20个字符宽度的FIRSTNAME,LASTNAME等。但是这个脚本生成的文件包含80个字符的FIRSTNAME和80个字符的LASTNAME,200个字符的COMPANY等。
此脚本在QA环境中按预期工作,但在PROD中不按预期工作。多个作业被配置为使用此格式,因此业务部门对更改分隔符不感兴趣。谁能告诉我这里发生了什么。
先谢谢你。
亲切问候,测试者阴影。
上述脚本预计将生成20个字符宽度的FIRSTNAME,LASTNAME等。但是这个脚本生成的文件包含80个字符的FIRSTNAME和80个字符的LASTNAME,200个字符的COMPANY等。我们使用的是sqlplus版本12。2

x8diyxa7

x8diyxa71#

您可以对列表达式进行别名和格式化:

COLUMN FIRSTNAME FORMAT A20
COLUMN LASTNAME FORMAT A20
COLUMN COMPANY FORMAT A50
COLUMN ADDRESS1 FORMAT A50
COLUMN ADDRESS2 FORMAT A50
COLUMN ADDRESS3 FORMAT A50
COLUMN CITY FORMAT A50
COLUMN STATE FORMAT A50

SELECT RPAD(FIRSTNAME,20,' ') AS FIRSTNAME,
RPAD(LASTNAME,20,' ') AS LASTNAME,
RPAD(COMPANY,50,' ') AS COMPANY,
RPAD(ADDRESS1,50,' ') AS ADDRESS1,
RPAD(ADDRESS2,50,' ') AS ADDRESS2,
RPAD(ADDRESS3,50,' ') AS ADDRESS3,
RPAD(CITY,50,' ') AS CITY,
RPAD(STATE,50,' ') AS STATE
FROM EmployeeDetails;

或连接成单个字符串:

SELECT RPAD(FIRSTNAME,20,' ') ||
RPAD(LASTNAME,20,' ') ||
RPAD(COMPANY,50,' ') ||
RPAD(ADDRESS1,50,' ') ||
RPAD(ADDRESS2,50,' ') ||
RPAD(ADDRESS3,50,' ') ||
RPAD(CITY,50,' ') ||
RPAD(STATE,50,' ')
FROM EmployeeDetails;

您还可以在每个环境中检查NLS_LANG setting,这可能会影响存储在多字节字符集中的值的显示方式。如果它们不同,那么即使对于相同的数据库字符集、列数据类型和值,您也会看到不同的结果。
例如,如果数据库中有一个varchar2(10)列,字符集为AL 32 UTF8,并将NLS_LANG设置为“英语_AMERICA”。US 7ASCII”,这是一个单字节字符集,然后查询该表将列显示为10个字符宽(在SQL*Plus中)。如果我将NLS_LANG更改为“英语_AMERIICA。AL 32 UTF8”并运行相同的查询,它将显示为40个字符宽。
由于您似乎正在使用Windows,您可以如链接的常见问题解答所示,使用以下内容更改您的设置:

set NLS_LANG=ENGLISH_AMERICA.US7ASCII

但是阅读整个FAQ并了解它在做什么,并选择一个合适的值。使用US 7ASCII,如果数据中有任何多字节(或非ASCII)字符,它将无法正确显示。如果你能找到在某些环境下工作的设置,那么你应该-希望-能够在任何地方使用它。
检查不同数据库中的字符集和数据类型也是值得的--尽管您希望QA和prod之间的字符集和数据类型是相同的。(一个快速的方法是select dump(firstname, 1016) from employeedetails fetch first 1 row only,它将显示数据类型和字符集。或查询数据字典。)

相关问题