Не комментируя, нормально это или мудро: да, я верю, что вы можете сделать это.То есть, я никогда не видел ничего написанного о EXECUTE IMMEDIATE
, которое бы указывало на то, что оно не повторное.Плюс, это работает, если вы попробуете это.
Вот простой, типичный EXECUTE IMMEDIATE
вызов:
DECLARE
l_count NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) INTO :l_count FROM DBA_OBJECTS WHERE ROWNUM <= 100' INTO l_count;
DBMS_OUTPUT.PUT_LINE ('l_count = ' || l_count);
END;
Здесь в основном то же самое, но с EXECUTE IMMEDIATE
вызовами, вложенными вдва уровня:
DECLARE
l_outer_count NUMBER;
BEGIN
EXECUTE IMMEDIATE q'!
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) INTO :x FROM DBA_OBJECTS WHERE ROWNUM <= 100' INTO :l_outer_count;
END;
!'
USING IN OUT l_outer_count;
DBMS_OUTPUT.PUT_LINE('l_outer_count = ' || l_outer_count);
END;
Я никогда не сталкивался с необходимостью сделать это.