2016-01-06 8 views
1
FOR rec IN (SELECT Procedure_Name 
       FROM DATAMART_PROCESS_STEPS 
       ORDER BY Procedure_Order) 
LOOP 
    EXECUTE rec; 
END LOOP; 

У меня есть процедура, которая управляет серией процедур из таблицы DATAMART_PROCESS_STEPS, и мне нужно динамически запускать каждую процедуру в этой таблице. Oracle SQL Developer не нравится, как я выполняю процедуры; он выдает синтаксическую ошибку. Каков правильный способ достижения этой задачи?Как динамически вызвать хранимую процедуру?

EXECUTE 'BEGIN ' || rec || '; END'; 

Я также пробовал это после прочтения учебника по хранимым процедурам, но у него есть проблема с одинарными кавычками. Помогите. Если вам нужно больше деталей или кода, просто спросите.

Заранее спасибо.

+0

Что ошибка Oracle бросает? Скопируйте ошибку в буфер обмена и выполните [веб-поиск] (http://google.com/search?q=your-error-comes-here). Ознакомьтесь с причинами ошибки и попробуйте предоставленные решения. Если вы не нашли решение, тогда [задайте вопрос] (http://stackoverflow.com/questions/ask) – xameeramir

+0

@student Спасибо за совет, но я уже сделал это, как вы предложили; «Обнаружен символ rec, когда ожидается ... ect». Он думает, что я должен: = вместо этого. Веб-поиск не помог. – PZNevill

+2

Вы пытались использовать EXECUTE IMMEDIATE? –

ответ

3

execute command - это SQL * Plus/SQL Сокращение разработчика для анонимного блока PL/SQL. Он недействителен внутри других PL/SQL, в том числе внутри вашей основной процедуры.

Динамические вызовы в PL/SQL используют несвязанные execute immediate statement, а в качестве синтаксической диаграммы ключевое слово немедленного не является необязательным.

execute immediate syntax diagram

Динамический оператор SQL в этом случае должен быть/SQL блок анонимного PL вокруг курсора поставляемого имени процедуры, как вы уже поняли. Но в вашей второй версии отсутствует точка с запятой после END, которую вы конкатенируете на строку; и вы ссылаетесь только на rec, а не на столбец внутри этого типа записи, т. е. используя имя столбца, который выбирает ваш курсор.

Таким образом, ваш цикл должен сделать:

FOR rec IN (SELECT Procedure_Name 
       FROM DATAMART_PROCESS_STEPS 
       ORDER BY Procedure_Order) 
LOOP 
    EXECUTE IMMEDIATE 'BEGIN ' || rec.procedure_name || '; END;'; 
END LOOP; 
Смежные вопросы