Разрешено ли использование функции таблицы PL/SQL Select Inside PL/SQL?

StackOverflow https://stackoverflow.com/questions/1597467

Вопрос

Документы для трубопроводных функций говорят, что DML не допускается, когда они используются в операторе SQL (обычно SELECT), и в большинстве примеров трубопроводные функции используются для генерации данных или преобразования данных (принятие каперота в качестве параметра), но не выпускать каких -либо операторов DML.

Теперь, технически, можно использовать выборы без какой -либо ошибки от Oracle (ORA 14551 не произойдет). Тем не менее, у меня есть опыт воспроизводимого странного поведения избранного; Несмотря на то PRAGMA AUTONOMOUS_TRANSACTION является нет используя ряды, извлеченные SELECT казаться нет Всегда принимая во внимание текущую локальную транзакцию, которая для меня кажется ошибкой. Еще более тревожным является тот факт, что при использовании распределенной транзакции (например, через Oramts вместо локальной транзакции) используется транзакция.

Редактировать: Как выясняется, странный эффект, кажется, связан с некоторыми с утверждениями в запросе, которые иногда работают, а иногда нет (в зависимости от текущего настроения оптимизатора Oracle, по крайней мере, в 10G). В некоторых случаях я получаю ORA-32036, а затем снова этого не происходит, не изменяя код вообще. Теперь выглядит так, как будто запросы, которые иногда терпят неудачу с ORA-32036, являются теми, которые также не могут использовать правильную транзакцию, и она может быть не связана с трубопроводной функцией.

Итак, мои конкретные вопросы:

  • Есть ли что -то, предпочтительно официальное, заявление, независимо от того, SELECTS в трубопроводной таблице допускается и каков их транзакционный контекст?

  • Существует ли другой способ модуляризации обычно используемых запросов, которые можно использовать в операторах SQL (точно так же, как функции таблицы могут с TABLE())?

  • Кто -нибудь также испытывал такое поведение и, возможно, знает об этом больше? Я изучил Metalink, но, к сожалению, я не нашел ничего конкретного по этой теме.

Это было полезно?

Решение

  1. Обычно ограничения DML только касаются изменения изменения (обновление, удаление ...) операторы, поэтому выберите, должен быть в порядке. Я постараюсь найти конкретное утверждение от Oracle.

  2. Просмотры будут вашим первым инструментом для модуляции общепринятых запросов.

  3. Функции имеют недостаток по поводу представлений: если они вызываются из другого выбора, они не выполняются в тот же момент времени, что и основной выбор. Каждый вызов на выбор является согласованным, но, поскольку выбор находится в коде функции, а не в основном SQL, вы можете вернуть противоречивые результаты. Это невозможно с представлениями и подразделением: если большой заявление вызывает представление, представление строится в тот же момент, что и основной запрос.

Обновлять: Относительно вашего комментария о параметризованных запросах

Вы можете создавать параметризованные представления, то есть представления, которые зависят от переменных, установленных до выполнения. Вот пример на Asktom показывая, как вы могли бы сделать это с userenv('client_info') или же dbms_session.set_context.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top