2012-02-15 3 views
0

Мы используем Java-приложение для развертывания XML-файлов, которые записываются в базу данных Oracle. XML-фрагменты в db хранятся в виде типов данных NCLOB. Как я могу получить XML-данные NCLOB из базы данных и вернуться в формат XML? Должен ли я использовать Java (я полный Java noob, BTW), или я могу использовать PowerShell здесь (мои предпочтения)? И в зависимости от метода, как бы я это сделал?Как получить данные XML NCLOB из базы данных Oracle

Причина, по которой я хочу это сделать, в основном для проверки до/после развертывания (сравните содержимое 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() 
} 
+0

Спасибо, Энди. Я попробую ваше решение. Быстрый вопрос, что я передаю для DataSource? В моих сценариях PowerShell я обычно подключаюсь к нашему дБ с использованием синтаксиса sqlplus (например, 'username/password @ // hostname: Port/SID'). Как эта строка соединения будет переведена для использования в вашем сценарии выше? – Keith

+0

@Keith Проверьте свои параметры в разделе «Поставщик данных .NET Framework для Oracle» [здесь] (http://www.connectionstrings.com/oracle). «Источник данных» - это псевдоним TNS, но вам не нужно его использовать. Ознакомьтесь с параметрами 'Omiting tnsnames.ora'. –

+0

@Keith Не забудьте, вам нужно установить ODAC для использования 'Oracle.DataAccess'. –

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/en-us/library/system.data .oracleclient.aspx) –

+0

Dang it! Я этого не заметил. Спасибо за головы. Во всяком случае, причина, по которой я пошел по этому пути, заключается в том, что я продолжал получать ошибки, пытаясь подключиться, используя «Oracle.DataAccess.Client.OracleConnection». Вот до тех пор, пока я не добрался до ошибки: '$ assembly = [System.Reflection.Assembly] :: LoadWithPartialName (« Oracle.DataAccess »)' '$ conn = Новый объект Oracle.DataAccess.Client.OracleConnection ('' "Источник данных = (ОПИСАНИЕ = (ADDRESS = (PROTOCOL = TCP) (HOST = имя хоста) (PORT = порт))' ' (CONNECT_DATA = (SERVICE_NAME = SID))); Идентификатор пользователя = имя пользователя; Пароль = password; ");' – Keith

+0

И вот сообщение об ошибке: 'New-Object: Exception, вызывающий« .ctor »с аргументом« 1 »:« Была сделана попытка загрузить программу с неправильным форматом ». – Keith

Смежные вопросы