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

Вниз

Простой вопрос.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
1-64623
ruslan_as
2002-05-08 10:39
2002.05.20
Список в TreeView1


3-64546
Novak
2002-04-24 12:02
2002.05.20
Интересно, просто очень интересно.


14-64805
Alexander Vasjuk
2002-04-10 19:57
2002.05.20
Помогите найти изображение Фемиды


1-64665
drt
2002-05-05 18:35
2002.05.20
Help!


1-64654
Soo
2002-05-02 16:46
2002.05.20
Перемещение текста в отдельном контейнере