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

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

Проблема использования IMMEDIATE в IB [IB6.x]


Slawik ©   (2002-05-18 13:08:00) 

Необходимо на уровне хранимой процедуры выполнять достаточно большой набор действий абсолютно одинаковых по сути для одной и тойже таблицы но для разных полей (тип полей одинаков).
Содал тестовую процедуру, но компиляции она не поддаеться, как только встречаеться IMMEDIATE:

CREATE PROCEDURE NEW_PROCEDURE (
NEW_PARAM INTEGER)
RETURNS (
OUT_PARAM INTEGER)
AS
DECLARE VARIABLE TMPFIELD VARCHAR(50);
declare variable TMP_SQL varchar(250);
begin
if (new_param = 0) then tmpfield = "NUM_BUY";
if (new_param = 1) then tmpfield = "NUM_SALE";
if (new_param = 2) then tmpfield = "NUM_CONVERT";

TMP_SQL = "select"|| :TMPFIELD ||"from CURR_CLIENT";

execute immediate :TMP_SQL
into :OUT_PARAM;

suspend;
end

Что я делаю не так?
EXECUTE IMMEDATE для IB описана еще в версии 5.5.


Johnmen   (2002-05-18 14:50:00) [1]

>kaif © (18.05.02 14:26) : В IB - НЕТ.


kaif   (2002-05-18 14:26:00) [2]

>2 Johnmen
А вообще макроподстановку использовать в хранимой процедуре допустимо? Я никогда не пробовал... Неужели это может заработать?

CREATE PROCEDURE AAA
AS
DECLARE VARIABLE BBB VARCHAR(250)
BEGIN
BBB = " PROCEDURE CCC";
EXECUTE :BBB;
END
^


Johnmen   (2002-05-18 14:19:00) [3]

Тоя проблема не в IMMEDIATE, а в Johnmen © (18.05.02 13:24).


kaif   (2002-05-18 14:14:00) [4]

Execute immediate описана наряду с такими командами, как Execute и Prepare. Все эти команды, как я полагаю, не являются частью синтаксиса внутри хранимых процедур, а используются в СИ в конструкциях клиентской части:
EXEC SQL
EXECUTE IMMEDIATE :insert_date;
Я думаю IB вообще не допускает макроподстановок нигде на уровне синтаксиса базы. Иначе он потерял бы возможность отслеживать DEPENDENCIES, которые не позволяют удалить таблицу, если ее поле используется где-то в хранимых процедурах.
Такого ограничения нет в MSSQL, но зато нет и соответствующей ссылочной целостности метаданных. То есть в MSSQL можноудалить таблицу, используемую в хранимых процедурах и сервер этого никак не заметит.


Slawik   (2002-05-18 13:37:00) [5]

>Romkin
>Такой конструкции в IB просто нет

Как же нету, если она описана (официальная дока), но вот заставить работать не получаеться.


Slawik   (2002-05-18 13:33:00) [6]

У меня "коробка" IB 5.5 и в описаниии никаких ограничений не указано, кроме того при компилировании процедуры IB уже ругаеться что не извесный оператор IMMEDIATE, а по сути он еще не знает что в стринговой переменной, оператор INTO комментировал, результат тот же!

Но такие ограничения мне знакомы (теоритически) но проверки не подвергались ....

Получаеться прийдеться множить текст процедуры под каждое поле?


Johnmen   (2002-05-18 13:24:00) [7]

Использование параметров и переменных для макроподстановки недопустимо...


Romkin   (2002-05-18 13:21:00) [8]

Такой конструкции в IB просто нет


Desdechado   (2002-05-18 13:20:00) [9]

цитата из LangRef.pdf
The SQL statement to execute must be stored in a host variable or be a string literal. It
can contain any SQL data definition statement or data manipulation statement that does
not return output
.


Наверх

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