![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Простой вопрос. [D5, Oracle]
Termik © (2002-04-23 18:00:00)Как выполнить динамический SQL в функции, вызов которой идет из SQL-оператора? Сервер выдает ошибку ORA-06571 и не хочет выполнять функцию. ЧТО ДЕЛАТЬ-ТО ?!
Заранее благодарю.
СЫН (2002-04-24 14:32:00) [1]1) У тебя V_Cursor NUMBER;
Попробуй V_Cursor INTEGER := DBMS_SQL.OPEN_CURSOR;
2) EXECUTE IMMEDIATE появился в 8.1.5, в 8.01 его нету, имхо
Termik (2002-04-24 13:52:00) [2]Значит, функция:
create or replace function TESTFUN(a NUMBER) return number is
Result VARCHAR2(2000);
Fun VARCHAR2(2000);
V_Cursor NUMBER;
V_SQL VARCHAR2(2000);
V_NumRows INTEGER;
begin
SELECT EXPR INTO Fun FROM TEST WHERE ID=a;
V_SQL := "select "|| Fun ||" from dual";
EXECUTE IMMEDIATE V_SQL
V_Cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(V_Cursor, V_SQL, DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN(V_Cursor, 1, Result, 5);
V_NumRows := DBMS_SQL.EXECUTE(V_Cursor);
LOOP
IF DBMS_SQL.FETCH_ROWS(V_cursor) = 0 THEN
EXIT;
END IF;
DBMS_SQL.COLUMN_VALUE(V_Cursor, 1, Result);
END LOOP;
DBMS_SQL.CLOSE_CURSOR(V_Cursor);
return(Result);
end TESTFUN;
В 10-й строчке стоит сабж.
При компилировании выводится: PLS-00103
Работаю с ORACLE 8.01 в PL/SQL Developer версии 4.0.1.399
В ЧЕМ ПРОБЛЕМА, А ?!
Севостьянов Игорь (2002-04-24 12:55:00) [3]Что значит не реагирует (не воспринимает) EXECUTE IMMEDIATE ???
Такого быть не может ... Какая у тебя версия Oracle ? Какой код ? Напиши свой SQL...
Termik (2002-04-24 09:51:00) [4]Не работает execute immediate ! Он, почему-то не воспринимает эту команду и приходится пользоваться модулем DBMS_SQL. Как выполнить динамический SQL ?
diana (2002-04-24 09:48:00) [5]если Oracle 8i и старше, то в нем есть замечательная возможность работать с динамическим SQL без DBMS_SQL -
EXECUTE IMMEDIATE
Работает так:
SQL_TEXT := "SELECT C.VALIDRANGE_ID "||
"FROM VALIDRANGE P, VALIDRANGE C "||
"WHERE P.VALIDRANGE_ID = :PAR AND C.EXPONENT_ID = :PAR_EXP AND "||DIM_WHERE;
EXECUTE IMMEDIATE SQL_TEXT
INTO CHILD
USING PARENT, R_GROUP.EXPONENT_ID;
Подробнее почитай в Help
roottim (2002-04-24 08:23:00) [6]ну ты же и писал!... все так и работает!
roottim (2002-04-24 08:22:00) [7]примерно такой вопрос был
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1019541070&n=1
Termik (2002-04-23 18:16:00) [8]Значит так !
Мной определено несколько функций: FUN1(a NUMBER), FUN2(b NUMBER) и т.д.
Программа на Делфях вызывает функцию FUN1 с параметром.
Функция FUN1 читает определенную запись в таблице (определяет по параметру). В этой записи определен SQL-оператор.
Далее, пользуясь модулем DBMS_SQL выполняем этот оператор.
В операторе записаны вызовы функций FUN2,...FUNn с параметрами, которые, пользуясь входным параметром, читают очередной SQL-оператор из таблицы и вызывают другие функции (или самих себя) через DBMS_SQL. Вот, вкратце, такая система...
Suntechnic (2002-04-23 18:04:00) [9]О вызове какой ф-ции идёт речь? Извольте выражаться яснее.