Как я могу запустить несколько разных операторов `insert` за один вызов с ADO.NET и Oracle? - PullRequest
3 голосов
/ 03 июня 2011

Следующее работает с MS SQL Server, но наша система Oracle выдает ошибку: ORA-00911: invalid character

string strQuery = @"

insert into DEVICE
( DEVICE_ID, DEVICE_NAME, TIMESTAMP) values
(:DEVICE_ID,:DEVICE_NAME, sysdate);
insert into INV
( INV_ID, DEVICE_ID, COMMENT, TIMESTAMP) values
(:INV_ID,:DEVICE_ID,:COMMENT, sysdate);

";

OracleConnection conn = getConn();
OracleCommand cmd = new OracleCommand(strQuery, conn);
cmd.Parameters.AddWithValue(":DEVICE_ID", device.Id);
cmd.Parameters.AddWithValue(":DEVICE_NAME", device.Name);
cmd.Parameters.AddWithValue(":INV_ID", newInvId());
cmd.Parameters.AddWithValue(":COMMENT", device.Comment);

Это только пример, но предположим, что некоторые поля были очень большими, и было множество операторов и т. Д.

Редактировать: Поместить операторы в блок (как вОтвет Тони Эндрюса) приводит к следующей ошибке:

[OracleException (0x80131938): ORA-06550: line 1, column 1:
PLS-00103: Encountered the symbol "" when expecting one of the following:

   begin case declare exit for function goto if loop mod null
   package pragma procedure raise return select separate type
   update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   form table call close current define delete fetch lock insert
   open rollback savepoint set sql execute commit forall merge
   library OPERATOR_ pipe
]

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Я не уверен, но сработает ли это, если вы превратите его в анонимный блок PL / SQL, как этот?

1 голос
/ 06 июня 2011

Я не уверен, почему ответ @Tony Andrews не сработал.(Возможно, некоторые имена столбцов вызывают проблемы; вы можете избежать имен COMMENT и TIMESTAMP. TIMESTAMP работал нормально для меня, но мне пришлось изменить COMMENT на COMMENTS.) Возможно, вставка из нескольких таблиц будет работать лучше:

insert all
    into device(device_id, device_name, timestamp)
    values(device_id, device_name, the_date)
    into inv(inv_id, device_id, comments, timestamp)
    values(inv_id, device_id, comments, the_date)
select :device_id device_id, :device_name device_name
    ,sysdate the_date, :inv_id inv_id, :comments comments from dual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...