Как получить данные NCLOB XML из базы данных Oracle
Мы используем приложение на основе Java для развертывания файлов XML, которые записываются в базу данных Oracle. Блобы XML в БД хранятся как типы данных NCLOB. Как мне получить данные NCLOB XML из базы данных и обратно в формат XML? Нужно ли мне использовать Java (я полный нуб Java, кстати), или я мог бы использовать PowerShell здесь (мои предпочтения)? И в зависимости от метода, как бы я это сделал?
Причина, по которой я хочу сделать это, в основном для проверки до / после развертывания (сравните содержимое XML до и после его развертывания).
Заранее спасибо Кит
2 ответа
Вот что я делал в прошлом для чтения / записи XML в Oracle CLOB с использованием ODAC. Это должно работать для 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()
@ Энди, спасибо, что направил меня в правильном направлении!:-)