Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-988
Янушка
2002-06-20 12:29
2002.07.01
Непослушная Label


1-991
Толик
2002-06-20 12:29
2002.07.01
Пошаговый проход исходников


1-945
besen-ok
2002-06-19 17:05
2002.07.01
Емуляция нажаться клавиши при ратоте с MS TErminal Сервер


3-850
avr555
2002-06-05 17:51
2002.07.01
Представление логических выражений


3-885
Duke2
2002-06-06 21:18
2002.07.01
Вопрос о разрушении BLOB в DBF и Paradox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский