使用批量收集pl sql进行更新

时间:2017-03-30 13:19:56

标签: oracle plsql locking

我有功能,我必须添加 for update 子句。

    FUNCTION FUNC_NAME(
    strValues IN arrayofstrings)
    RETURN arrayofnumbers IS
    ids arrayofnumbers := arrayofnumbers();
BEGIN
    SELECT myId BULK COLLECT INTO ids
    FROM table_1
    WHERE table_1.rownum1 IN (select column_value from table(strValues))
    GROUP BY myId
    HAVING count(*) = (select count(*) from table(strValues))
    --for update of myId
    ;
    RETURN ids;
END FUNC_NAME;

但如果删除评论,则错误

Error(26,7): PL/SQL: ORA-01786: FOR UPDATE of this query expression is not allowed

如何重建我的查询?

1 个答案:

答案 0 :(得分:1)

您不能简单地使用public static int WritetoAccountsTable(string Comment, int PriorityInt, string filePath) { using (System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection("data source=" + filePath + "; Synchronous=Off")) { using (System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand(conn)) { conn.Open(); cmd.CommandText = @"INSERT INTO Accounts(Description,Priority) values(@Comment,@PriorityInt)"; cmd.Parameters.AddWithValue("@Comment", Comment); cmd.Parameters.AddWithValue("@PriorityInt", PriorityInt); return cmd.ExecuteNonQuery(); } } } 使用for update子句锁定表中的行。 group by子句通过对指定列上的记录进行分组来提供表数据的整体视图,因此如果您锁定任何DML的行,它也没有意义。您可以使用如下方式锁定行。

<强>或者:

在示例中,我使用Oracle内置集合group by

sys.odcinumberlist

CREATE OR REPLACE FUNCTION FUNC_NAME (strValues IN SYS.odcinumberlist)
   RETURN SYS.odcinumberlist
IS
   ids   SYS.odcinumberlist;

   CURSOR fall_jobs_cur (strValues IN SYS.odcinumberlist)
   IS
          SELECT myId
            FROM table_1
           WHERE table_1.rownum1 IN (SELECT COLUMN_VALUE
                                       FROM TABLE (strValues))
      FOR UPDATE OF myId;
BEGIN
   OPEN fall_jobs_cur (strValues);

   FETCH fall_jobs_cur BULK COLLECT INTO ids;

   RETURN ids;
END FUNC_NAME;

以上两个代码将被编译,但是当你执行它时,你将再次面临问题。

赞:

CREATE OR REPLACE FUNCTION FUNC_NAME (strValues IN SYS.odcinumberlist)
   RETURN SYS.odcinumberlist
IS
   ids   SYS.odcinumberlist;
BEGIN
       SELECT myId
         BULK COLLECT INTO ids
         FROM table_1
        WHERE table_1.rownum1 IN (SELECT COLUMN_VALUE
                                    FROM TABLE (strValues));
      FOR UPDATE OF myId;

   RETURN ids;
END FUNC_NAME;

所以我的问题是你真正想要实现的目标。