Возврат уникальных идентификаторов из оператора Oracle Update в VB.NET - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь обновить выборку строк в таблице Oracle, которую мы используем для обработки сообщений.Поскольку эта таблица занята, было бы лучше, если бы обновление могло возвращать уникальные идентификаторы строк, которые оно обновило в атомарной транзакции.Я изменил пример кода, который нашел в StackOverflow, чтобы он выглядел следующим образом, но когда я проверяю параметр «p», я не вижу никакой информации, возвращающейся из оператора обновления, как я ожидал.

Любойпредложения по изменению либо кода .NET, устанавливающего вызов Oracle, либо самого оператора SQL SQL?

        Dim connectString As String = data source=ORA1;user id=MESSAGEBOX;password=MESSAGEBOX

    Dim conn As New OracleConnection(connectString)
    If conn.State <> ConnectionState.Open Then
        conn.Open()
    End If
    Dim transaction As OracleTransaction = conn.BeginTransaction()

    Dim cmd As New OracleCommand()
    cmd.Connection = conn

    cmd.CommandText = "BEGIN UPDATE MESSAGE_TABLE SET C_WAS_PROCESSED = 2 WHERE C_ID IN (SELECT * FROM(SELECT C_ID FROM MESSAGE_TABLE WHERE C_WAS_PROCESSED = 0 AND  C_CREATED_DATE_TIME < CAST(SYSTIMESTAMP AT TIME ZONE 'UTC' AS DATE)  ORDER BY C_MESSAGE_PRIORITY, C_ID) WHERE ROWNUM < 16)  RETURNING C_ID BULK COLLECT INTO :C_ID; END;"


    cmd.CommandType = CommandType.Text

    cmd.BindByName = True
    cmd.ArrayBindCount = 15

    Dim p As New OracleParameter()
    p.ParameterName = "C_ID"
    p.Direction = ParameterDirection.Output
    p.OracleDbType = OracleDbType.Int64
    p.Size = 15
    p.ArrayBindSize = New Integer() {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}
    p.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    cmd.Parameters.Add(p)

    Dim nRowsAffected As Integer = cmd.ExecuteNonQuery()

    transaction.Commit()
    conn.Close()
    conn.Dispose()

1 Ответ

0 голосов
/ 31 января 2019

Я считаю, что проблема здесь в том, что переменная SQL RETURNED BULK COLLECT INTO должна иметь тип TABLE, а не простой числовой тип.

Измените ваш SQL, включив в него блок объявления следующим образом:

cmd.CommandText = "DECLARE TYPE IDS IS TABLE OF MESSAGE_TABLE.C_ID%TYPE; C_ID IDS; 
BEGIN UPDATE MESSAGE_TABLE SET C_WAS_PROCESSED = 2 WHERE C_ID IN (SELECT * FROM(SELECT C_ID FROM MESSAGE_TABLE WHERE C_WAS_PROCESSED = 0 AND  C_CREATED_DATE_TIME < CAST(SYSTIMESTAMP AT TIME ZONE 'UTC' AS DATE)  ORDER BY C_MESSAGE_PRIORITY, C_ID) WHERE ROWNUM < 16)  RETURNING C_ID BULK COLLECT INTO :C_ID; END;"

Я получил синтаксис объявления таблицы по этой oracle-base.com ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...