Я ищу способ с помощью PL/SQL, чтобы проверить, является ли инструкция, выполняемая 'Execute immediately', оператором dml.Oracle: проверить утверждение dml
ответ
Я думаю, вы можете проверить его, используя SQL% ROWCOUNT. например, (грубый блок, непроверенных)
set serveroutput on
begin
execute immediate 'update tableA set fieldA=100';
if(SQL%ROWCOUNT > 0) then
dbms_output.put_line('DML');
end if;
end;
/
SQL-% ROWCOUNT возвращает количество строк, затронутых последней DML. Итак, если оператор, выполняемый непосредственным оператором, является оператором DML, и если это что-то изменит, то sql% rowcount будет больше 0. В противном случае, если это DDL, то использование SQL% ROWCOUNT, скорее всего, вызовет исключение (или он будет приравнять к 0)
В случае какого-либо запроса на обновление, например, «обновить someTable, где критерий, который не имеет результата?» SQL% ROWCOUNT будет равно 0, поэтому обнаружение DDL будет неудачным. –
Там может решение проверить, если строка запроса содержит «INSERT» или «UPDATE» или ...
Но я не думаю, что может быть общим и последовательным решением
Что делать, если sql вызывает пакет или процедуру хранения, которая может вызывать DML или DLL?
Я думаю, что вы можете позвонить по телефону BEFORE/AFTER DDL TRIGER или расследовать по телефону ora_sysevent
Ни в коем случае я не знаю. В основном, если вы используете Execute Immediate, ваша работа должна знать, что выполняется, т. Е. Вы никогда не должны позволять ей запускать произвольный код, предоставленный пользователем или какой-либо другой программой в первую очередь. –