Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.01;
Скачать: CL | DM;

Вниз

Как внести данные в таблицу внутри 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
14-1150
vopros
2002-05-27 15:26
2002.07.01
Кто из Питера АУУУ?Намек поняли?


14-1204
Olivka
2002-05-31 20:32
2002.07.01
Дистрибутив ИЕ


14-1164
Bj
2002-05-29 14:01
2002.07.01
Требуется написать програмку, кот печатает квитанции клиентам...


1-1058
SeF
2002-06-18 16:03
2002.07.01
form in dll


14-1167
McSimm
2002-05-30 14:22
2002.07.01
Схожу с ума?