在处理多语言设置,如美式英语(AMERICAN)和德语(GERMAN)时,可能在使用原生Oracle数据库(例如sqlplus)查询日期字段时遇到过"ORA-01843: not a valid month"的错误。当使用ODBC(可能来自VBScript)时,这个问题更加严重,因为如果选择日期字段,将得不到任何行。本文将向展示如何在数据库脚本中确保使用正确的NLS_LANG参数。
首先,通过VBScript调整脚本的进程环境:
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")
Dim oEnv
Set oEnv = oShell.Environment("PROCESS")
oEnv.Item("NLS_LANG") = "AMERICAN_AMERICA.WE8ISO8859P1"
WScript.Echo oEnv.Item("NLS_LANG")
首先使用CreateObject("WScript.Shell")访问当前的shell。通过shell,可以访问当前进程的环境。现在可以为NLS_LANG参数设置一个正确的值。通过这段代码,可以确保脚本运行时NLS_LANG参数设置正确。不再需要担心客户机上的注册表设置。
以下是完整的脚本,它将NLS_LANG设置为AMERICAN_AMERICA.WE8ISO8859P1,查询数据库并将结果写入STDOUT:
Dim strCon
strCon = "Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=; uid=read;pwd=read;"
' 设置NLS_LANG为AMERICAN_AMERICA
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")
Dim oEnv
Set oEnv = oShell.Environment("PROCESS")
oEnv.Item("NLS_LANG") = "AMERICAN_AMERICA.WE8ISO8859P1"
WScript.Echo oEnv.Item("NLS_LANG")
' 查询语句
Dim strSql
strSql = "SELECT myfield from mytable"
Dim oCon
Set oCon = WScript.CreateObject("ADODB.Connection")
Dim oRs
Set oRs = WScript.CreateObject("ADODB.Recordset")
oCon.Open strCon
Set oRs = oCon.Execute(strSql)
While Not oRs.EOF
WScript.Echo oRs.Fields(0).Value & _
" " & oRs.Fields(1).Value
oRs.MoveNext
Wend
oCon.Close
Set oRs = Nothing
Set oCon = Nothing
Set oCon = Nothing