PLS-00457 错误:如何解析 ids 数组以在 Oracle 中执行语句

问题描述 投票:0回答:1

以下脚本给我一条错误消息:

PLS-00457: expressions have to be of SQL types

DECLARE
    type t_num is table of number;
    bp_id INTEGER := 14058;
    zab_ids            t_num;
BEGIN

    SELECT zab.ID_ZAB BULK COLLECT 
    into zab_ids
    FROM TB_ZAB zab
             left join TB_ZBEZ zbez
                       on zab.ID_ZBEZ = zbez.ID_ZBEZ
    where zbez.ID_BP = bp_id;
    EXECUTE IMMEDIATE 'DELETE FROM TB_EGZAB where TB_EGZAB.ID_ZAB in (:ids)' USING zab_ids;
END;

我对 PLSQL 很陌生,所以我不太明白为什么会出现这个错误? 也许我必须将 ids 转换为逗号分隔的字符串? 这些 id 应该稍后重用,所以我认为将它们存储到变量中是一个很好的 id。

谢谢并致以诚挚的问候

oracle-database plsql
1个回答
0
投票

不需要 EXECUTE IMMEDIATE,在这种情况下可以在 pl/sql 中执行 DML,不会出现问题。由于 zab_ids 是一个嵌套表,您必须使用 LOOP 或 FORALL 语句。

以下是在 EMP 示例表上使用 FORALL 的示例:

DECLARE
    type t_num is table of number;
    l_empnos            t_num;
BEGIN

    SELECT empno BULK COLLECT 
      INTO l_empnos
      FROM emp ;
    FORALL i IN l_empnos.FIRST .. l_empnos.LAST
      DELETE emp WHERE empno = l_empnos(i);
END;
/
© www.soinside.com 2019 - 2024. All rights reserved.