Форум: "Базы";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];
ВнизПростой вопрос. Найти похожие ветки
← →
Termik (2002-04-23 18:00) [0]Как выполнить динамический SQL в функции, вызов которой идет из SQL-оператора? Сервер выдает ошибку ORA-06571 и не хочет выполнять функцию. ЧТО ДЕЛАТЬ-ТО ?!
Заранее благодарю.
← →
Suntechnic (2002-04-23 18:04) [1]О вызове какой ф-ции идёт речь? Извольте выражаться яснее.
← →
Termik (2002-04-23 18:16) [2]Значит так !
Мной определено несколько функций: FUN1(a NUMBER), FUN2(b NUMBER) и т.д.
Программа на Делфях вызывает функцию FUN1 с параметром.
Функция FUN1 читает определенную запись в таблице (определяет по параметру). В этой записи определен SQL-оператор.
Далее, пользуясь модулем DBMS_SQL выполняем этот оператор.
В операторе записаны вызовы функций FUN2,...FUNn с параметрами, которые, пользуясь входным параметром, читают очередной SQL-оператор из таблицы и вызывают другие функции (или самих себя) через DBMS_SQL. Вот, вкратце, такая система...
← →
roottim (2002-04-24 08:22) [3]примерно такой вопрос был
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1019541070&n=1
← →
roottim (2002-04-24 08:23) [4]ну ты же и писал!... все так и работает!
← →
diana (2002-04-24 09:48) [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
← →
Termik (2002-04-24 09:51) [6]Не работает execute immediate ! Он, почему-то не воспринимает эту команду и приходится пользоваться модулем DBMS_SQL. Как выполнить динамический SQL ?
← →
Севостьянов Игорь (2002-04-24 12:55) [7]Что значит не реагирует (не воспринимает) EXECUTE IMMEDIATE ???
Такого быть не может ... Какая у тебя версия Oracle ? Какой код ? Напиши свой SQL...
← →
Termik (2002-04-24 13:52) [8]Значит, функция:
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 14:32) [9]1) У тебя V_Cursor NUMBER;
Попробуй V_Cursor INTEGER := DBMS_SQL.OPEN_CURSOR;
2) EXECUTE IMMEDIATE появился в 8.1.5, в 8.01 его нету, имхо
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c