У меня есть следующие внутри package
и он дает мне ошибку:ORA-14551: не может выполнить операцию DML внутри запроса
ORA-14551: cannot perform a DML operation inside a query
Кодекс:
DECLARE
CURSOR F IS
SELECT ROLE_ID
FROM ROLE
WHERE GROUP = 3
ORDER BY GROUP ASC;
BEGIN
FOR R IN F LOOP
DELETE FROM my_gtt_1;
COMMIT;
INSERT INTO my_gtt_1
(USER, role, code, status)
(SELECT
trim(r.user), r.role, r.code, MAX(status_id)
FROM
table1 r,
tabl2 c
WHERE
r.role = R.role
AND r.code IS NOT NULL
AND c.group = 3
GROUP BY
r.user, r.role, r.code);
SELECT c.role,
c.subgroup,
c.subgroup_desc,
v_meb_cnt
INTO record_type
FROM ROLE c
WHERE c.group = '3' and R.role = '19'
GROUP BY c.role,c.subgroup,c.subgroup_desc;
PIPE ROW (record_type);
END LOOP;
END;
я называю пакет, как это в одном из моих процедур ...:
OPEN cv_1 for SELECT * FROM TABLE(my_package.my_func);
, как я могу избежать этого ORA-14551
эр ROR?
FYI Я не вставлял весь код внутри цикла. В основном внутри цикла я вхожу в материал GTT, удаляя материал из GTT, а затем выбираю материал из GTT и добавляю его к курсору.
Рассматривая код и способ использования GTT, похоже, что вы можете определенно заполнить 'record_type' результатом вставки/выбора за одну операцию. Я бы назвал «record_type» что-то вроде «role_record» - лучше сохранить _type для типов. – JulesLt