如何从Oracle数据库中获取NCLOB XML数据

如何从Oracle数据库中获取NCLOB XML数据,xml,oracle,powershell,nclob,Xml,Oracle,Powershell,Nclob,我们使用基于Java的应用程序部署XML文件,这些文件被写入Oracle数据库。数据库中的XML blob存储为NCLOB数据类型。我将如何从数据库获取NCLOB XML数据并将其恢复为XML格式?我是否需要使用Java(顺便说一句,我是一个完全的JavaNoob),或者我可以在这里使用PowerShell(我的首选)?根据方法的不同,我该如何做呢 我之所以要这样做,主要是为了进行部署前/部署后验证(比较部署前后的XML内容) 提前感谢,, Keith以下是我过去使用Oracle CLOB读/写

我们使用基于Java的应用程序部署XML文件,这些文件被写入Oracle数据库。数据库中的XML blob存储为NCLOB数据类型。我将如何从数据库获取NCLOB XML数据并将其恢复为XML格式?我是否需要使用Java(顺便说一句,我是一个完全的JavaNoob),或者我可以在这里使用PowerShell(我的首选)?根据方法的不同,我该如何做呢

我之所以要这样做,主要是为了进行部署前/部署后验证(比较部署前后的XML内容)

提前感谢,,
Keith

以下是我过去使用Oracle CLOB读/写XML时所做的工作。这应该适用于NCLOB,只需很少的修改

# Load ODAC. This might fail if it is not installed or is the wrong bitness.
$assembly = [System.Reflection.Assembly]::LoadWithPartialName("Oracle.DataAccess")

# Connect to Oracle.
$connStr = 'Data Source=hostname:1521/sidname; User Id=sys; Password=password; DBA Privilege=SYSDBA;'
$conn = New-Object Oracle.DataAccess.Client.OracleConnection -ArgumentList $connStr
$conn.Open()

# Query the table.
$q = "select MY_CLOB_FIELD from My_Table"
$command = new-object Oracle.DataAccess.Client.OracleCommand($q, $conn)

# Process records.
$reader = $command.ExecuteReader()
while ($reader.Read()) {
    # Read the CLOB field and cast to an XML document.
    $xmlDoc = [xml] $reader.getstring(0) # XML

    #... XML Processing Here ....

    # Commit the updated XML.
    $sql = "UPDATE My_Table SET MY_CLOB_FIELD = :1"
    $updateCmd = New-Object Oracle.DataAccess.Client.OracleCommand ($sql, $conn)

    $param = New-Object Oracle.DataAccess.Client.OracleParameter (
        "xml", #Name
        [Oracle.DataAccess.Client.OracleDbType]::Clob, #Type
        $xmlDoc.OuterXml, #Data
        'Input' #Direction
    )

    $newParam = $updateCmd.Parameters.Add($param) 
    $result = $updateCmd.ExecuteNonQuery()
}

这是我最后使用的代码:

$Assembly = [System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient")

$conn = New-Object System.Data.OracleClient.OracleConnection( `
“Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=port)) `
(CONNECT_DATA=(SERVICE_NAME=SID)));User Id=username;Password=password;”);

$conn.Open()

# Query the table.
$q = "SELECT column FROM table WHERE column='something'"
$command = New-Object System.Data.OracleClient.OracleCommand ($q, $conn)

$xmlfile = "c:\temp\xml\temp.xml"
# Process records.
$reader = $command.ExecuteReader()
while ($reader.Read()) 
{
    # Read the NCLOB field and cast to an XML document.
    $xmlDoc = [xml] $reader.getstring(0) # XML
    $xmlDoc.Save($xmlfile)
}
$conn.Close()

@安迪,谢谢你把我引向正确的方向!:-)

谢谢你,安迪。我会试试你的解决方案。快速提问,我应该为DataSource传递什么?在我的PowerShell脚本中,我通常使用sqlplus语法(例如,
username/password@//hostname:Port/SID
)连接到数据库。如何将此连接字符串转换为在上面的脚本中使用?@Keith请查看
.NET Framework Data Provider for Oracle
部分下的选项<代码>数据源是TNS别名,但您不必使用它。查看省略tnsnames.ora的
选项。@Keith别忘了,您需要安装ODAC才能使用
Oracle.DataAccess
。Andy,再次感谢您的反馈。非常感谢!我会让你知道事情是如何发展的。@Keith np,我想你也会发现有帮助的。请注意——该死!我没注意到。谢谢你的提醒。不管怎么说,我之所以走这条路,是因为我尝试使用
Oracle.DataAccess.Client.OracleConnection
进行连接时不断出错。以下是我在遇到错误之前得到的信息:
$assembly=[System.Reflection.assembly]::LoadWithPartialName(“Oracle.DataAccess”)
$conn=新对象Oracle.DataAccess.Client.OracleConnection(```数据源=(描述=(地址=(协议=TCP)(主机名)(端口=端口))```(连接数据=(服务\名称=SID)));用户Id=用户名;密码=密码;“”以下是错误消息:
新对象:异常调用带有“1”参数的“.ctor”:“试图加载格式不正确的程序。
我希望使用您的解决方案,但需要通过该错误。”。我用一个连接字符串的例子更新了我的答案,这个连接字符串就像你习惯使用的一样。不要使用
DBA特权=SYSDBA如果您不需要它。