我有一个脚本文件包含这样的脚本。
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
1条答案
按热度按时间x8diyxa71#
您可以对列表达式进行别名和格式化:
或连接成单个字符串:
您还可以在每个环境中检查NLS_LANG setting,这可能会影响存储在多字节字符集中的值的显示方式。如果它们不同,那么即使对于相同的数据库字符集、列数据类型和值,您也会看到不同的结果。
例如,如果数据库中有一个
varchar2(10)
列,字符集为AL 32 UTF8,并将NLS_LANG设置为“英语_AMERICA”。US 7ASCII”,这是一个单字节字符集,然后查询该表将列显示为10个字符宽(在SQL*Plus中)。如果我将NLS_LANG更改为“英语_AMERIICA。AL 32 UTF8”并运行相同的查询,它将显示为40个字符宽。由于您似乎正在使用Windows,您可以如链接的常见问题解答所示,使用以下内容更改您的设置:
但是阅读整个FAQ并了解它在做什么,并选择一个合适的值。使用US 7ASCII,如果数据中有任何多字节(或非ASCII)字符,它将无法正确显示。如果你能找到在某些环境下工作的设置,那么你应该-希望-能够在任何地方使用它。
检查不同数据库中的字符集和数据类型也是值得的--尽管您希望QA和prod之间的字符集和数据类型是相同的。(一个快速的方法是
select dump(firstname, 1016) from employeedetails fetch first 1 row only
,它将显示数据类型和字符集。或查询数据字典。)