【问题标题】:Using for update with bulk collect pl sql使用批量收集 pl sql 进行更新
【发布时间】:2017-03-30 13:19:55
【问题描述】:

我有一个函数,我必须在其中添加 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

如何重建我的查询?

【问题讨论】:

  • 这是一个语法错误 - 它应该是for update OF myId
  • @TonyAndrews,是的,我在示例中错过了“OF”
  • @Nikolas。这里的问题是你为什么要那样做。你有什么要求。你不能用那种方式

标签: oracle plsql locking


【解决方案1】:

您不能简单地使用for update 锁定表中的行,而您正在使用group by 子句。 group by 子句将通过对指定列上的记录进行分组来提供表数据的整体视图,因此,如果您为任何 DML 锁定行,它也没有意义。您可以使用如下并锁定行。

任一:

在此示例中,我使用 Oracle 内置集合 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;

上面的两个代码都可以编译,但是当你执行它时,你又会遇到问题。

点赞:

SQL> SELECT FUNC_NAME(sys.odcinumberlist(1,2,3)) col1 from dual;
SELECT FUNC_NAME(sys.odcinumberlist(1,2,3)) col1 from dual
       *
ERROR at line 1:
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "FUNC_NAME", line 8
ORA-06512: at "FUNC_NAME", line 14

所以我的问题是你真正想要实现什么。

【讨论】:

  • 我想阻止表table_1进行异步查询
  • 第二个变种没问题)谢谢
猜你喜欢
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多