以下脚本给我一条错误消息:
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。
谢谢并致以诚挚的问候
不需要 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;
/