2012-02-15 147 views
0

我们使用基于Java的应用程序来部署XML文件,这些文件被写入Oracle数据库。 db中的XML blob存储为NCLOB数据类型。我将如何从数据库获取NCLOB XML数据并将其转换回XML格式?我需要使用Java(我是一个完整的Java noob,BTW),还是我可以在这里使用PowerShell(我的首选项)?取决于方法,我将如何做到这一点?如何从Oracle数据库获取NCLOB XML数据

我想这样做的原因主要是前/后部署验证(比较部署之前和之后的XML内容)。

由于提前, 基思

回答

2

这是我在过去所做的那样使用ODAC在甲骨文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() 
} 
+0

谢谢安迪。我会试试你的解决方案。快速的问题,我通过DataSource传递什么信息?在我的PowerShell脚本中,我通常使用sqlplus语法(例如'username/password @ // hostname:Port/SID')连接到我们的dB。如何将此连接字符串转换为在您的脚本中使用? – Keith 2012-02-16 03:30:32

+0

@Keith查看你在'.NET Framework数据提供者for Oracle'部分下的选项[here](http://www.connectionstrings.com/oracle)。 '数据源'是一个TNS别名,但你不必使用它。看看'省略tnsnames.ora'选项。 – 2012-02-16 03:40:30

+0

@Keith别忘了,你需要安装ODAC才能使用'Oracle.DataAccess'。 – 2012-02-16 03:41:28

0

这是我最后使用的代码:

$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() 

@Andy,用于操纵我的方向是正确的感谢! :-)

+0

被警告 - [System.Data.OracleClient中的类型已被弃用,并且将在未来的.NET Framework版本中被删除。](http://msdn.microsoft.com/zh-cn/library/system.data .oracleclient.aspx) – 2012-02-16 23:23:59

+0

当它!我没有注意到这一点。感谢您的高举。无论如何,我沿着这条路走下去的原因是因为我不断尝试使用'Oracle.DataAccess.Client.OracleConnection'进行连接。这里是我碰到错误之前:'$ assembly = [System.Reflection.Assembly] :: LoadWithPartialName(“Oracle.DataAccess”)' '$ conn = New-Object Oracle.DataAccess.Client.OracleConnection(数据源=(描述=(地址=(协议= TCP)(主机=主机名)(端口=端口))'' (CONNECT_DATA =(SERVICE_NAME = SID))); User Id = username; Password =密码;“);' – Keith 2012-02-17 00:09:20

+0

这里是错误信息:'New-Object:带有”1“参数的调用”.ctor“的异常:”试图加载格式不正确的程序。“ – Keith 2012-02-17 00:10:53

相关问题