У меня есть таблица с:
ID (int, generated)
OriginalID (int, nullable)
...
other columns.
При вставке записи я хотел бы установить «OriginalID» на «ID», который был сгенерирован. В настоящее время сценарий выглядит так:
BEGIN ATOMIC
DECLARE i INT;
SET i = SELECT ID FROM NEW TABLE(INSERT INTO MyTable(...) VALUES (....));
UPDATE MyTable SET ORIGINALID=i WHERE ID=i;
END
теперь у меня есть проблема, как вернуть «i», чтобы получить значение в коде, при вызове метода ExecuteScalar?
Я уже пробовал «SELECT i FROM SYSIBM.SYSDUMMY1», «VALUES (i)» - оба оператора возвращают «null» в коде.
Я получаю значение, если вызываю ExecuteScalar с таким сценарием: SELECT ID FROM NEW TABLE(INSERT INTO MyTable(...) VALUES (....));
Запрос выполняется из кода c# (. net core / IBM.Data.DB2.Core 1.2.2.100) с использованием DB2Connection и DB2Command:
var query = ...;
var connection = new DB2Connection(conn_string);
var command = new DB2Command(connection, query);
command.parameters.Add(...);
var returnValue = command.ExecuteScalar(); << the value here is always
null if trying to return the db2 variable; it works only if executing
"single statement"
**** edit ****
Получил работу с помощью Марка Баринштейна:
последний оператор в запросе теперь: "set @newId = я;" и в коде:
var newId = new DB2Parameter("@newId", DB2Type.Integer);
newId.Direction = System.Data.ParameterDirection.Output;
command.Parameters.Add(newId);
command.ExecuteNonQuery();
var id = newId.Value;