Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Простой вопрос. [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]

О вызове какой ф-ции идёт речь? Извольте выражаться яснее.


Наверх

Титульная страница Поиск, карта сайта Написать письмо