2013-02-24 1 views
3

Я ищу способ с помощью PL/SQL, чтобы проверить, является ли инструкция, выполняемая 'Execute immediately', оператором dml.Oracle: проверить утверждение dml

+1

Ни в коем случае я не знаю. В основном, если вы используете Execute Immediate, ваша работа должна знать, что выполняется, т. Е. Вы никогда не должны позволять ей запускать произвольный код, предоставленный пользователем или какой-либо другой программой в первую очередь. –

ответ

0

Я думаю, вы можете проверить его, используя 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)

+3

В случае какого-либо запроса на обновление, например, «обновить someTable, где критерий, который не имеет результата?» SQL% ROWCOUNT будет равно 0, поэтому обнаружение DDL будет неудачным. –

1

Там может решение проверить, если строка запроса содержит «INSERT» или «UPDATE» или ...
Но я не думаю, что может быть общим и последовательным решением
Что делать, если sql вызывает пакет или процедуру хранения, которая может вызывать DML или DLL?
Я думаю, что вы можете позвонить по телефону BEFORE/AFTER DDL TRIGER или расследовать по телефону ora_sysevent

 Смежные вопросы

  • Нет связанных вопросов^_^