Форум: "Базы";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];
ВнизКак внести данные в таблицу внутри EXECUTE IMMEDIATE ? Найти похожие ветки
← →
Termik (2002-06-07 12:08) [0]Мастера, помогите !
Формирую динамический запрос вида: SQL_Str := "SELECT MyFunc(Param) FROM dual".
В функции MyFun есть, в частности, оператор "INSERT ....".
Далее, пытаюсь выполнить: EXECUTE IMMEDIATE SQL_Str INTO My_Result.
В ответ на попытку выполнения сервер выдает ответ: "Невозможно выполнение оператора DML внутри запроса."
Как можно это обойти ?
← →
Johnny Smith (2002-06-07 12:38) [1]Ситуация здесь такая.
В принципе, выполнять Insert, Update, Delete в функциях нельзя. Для этого должны использоваться хранимые процедуры.
Однако...
Если у тебя Оракл 8i (а у тебя, похоже, именно он или "девятка"), то если ты используешь функцию с DML внутри не в Select"е, а в Insert"e или Update"е, то ошибки не возникнет (если Insert или Update относятся к другой таблице).
В твоем же случае лучше все-таки запихнуть Dynamic SQL в процедуру.
← →
Jim (2002-06-07 12:39) [2]Попробуй DBMS_SQL...
← →
petr_v_a (2002-06-07 12:39) [3]Никак. Функция, вызываемая в select, не может модифицировать данные.
← →
MishGan` (2002-06-07 13:13) [4]Хранимые функции в ORACLE могут вызываться двумя способами
1) В предложении SQL (т.е. как в примере у автора вопроса)
SELECT MyFunc(Param) FROM dual
В этом случае функция должная иметь ряд ограничений, таких как отсутствие внутри себя операторов DML (insert, update, deelte), запрещается использовать пакет DBMS_SQL и т.д.
2) В коде PL/SQL. Здесь вышеперечисленных ограничений не накладывается.
DECLARE
RES INT;
BEGIN
RES:=MyFunc(Param);
END;
Так что думаю здесь все решаемо.
← →
Termik (2002-06-07 13:18) [5]>MishGan" Дело в том, что функция My Func формируется динамически, поэтому так работать не будет.
← →
MishGan` (2002-06-07 13:53) [6]Как понять динамечески?
Т.е. пользователь в процессе работы выполняет: create or replace function...?
← →
MishGan` (2002-06-07 14:07) [7]Termik, может быть так подойдет для решения задачи:
SQL> create or replace function f1 return int is
2 begin
3 return(1);
4 end;
5 /
Function created.
SQL> begin
2 execute immediate "DECLARE i int; BEGIN i:=f1; END;";
3 end;
4 /
PL/SQL procedure successfully completed.
SQL>
← →
Termik (2002-06-07 14:10) [8]>MishGan"
Нет, отдельные части составной функции MyFunc берутся из разных записей сторонней таблицы (она, в принципе, не имеет отношения к делу). Я немого неправильно написал строку формирования динамического SQL. Она выглядит так:
SQL_Str := "SELECT "|| MyFunc ||" FROM dual".
Ну вот, MyFunc формируется динамически. Затем и нужен Execute Immediate, чтобы ее выполнить и вернуть результат.
Поэтому так, как ты написал, работать не будет.
← →
MishGan` (2002-06-07 14:14) [9]А почему так нельзя, не пойму:
SQL_Str := "DECLARE i int; BEGIN i:="||MyFunct||"; END;";
← →
Termik (2002-06-07 14:31) [10]>MishGan"
СЛУШАЙ, А ТЫ, НАВЕРНОЕ, ПРАВ ! Сейчас попробую и напишу о результатх.
← →
Termik (2002-06-07 14:32) [11]А переменная i вернется ?
← →
MishGan` (2002-06-07 14:52) [12]>>А переменная i вернется ?
Над этим я особо не думал. Но могу предложить завести временную таблицу из двух полей (id_транзакции и значения) и через нее передавать результат. Это первое, что приходит в голову.
Пример:
create global temporary table temp_table (transaction_id varchar2(100), value int);
А вставлять так (через EXECUTE IMMEDIATE):
insert into temp_table values (dbms_transaction.local_transaction_id,1);
Ну и читать потом значение из основного кода.
Повторюсь, что это первое, что пришло в голову. Уверен, что есть решение лучше.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c