Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Динамическое построение SQL запросов / 10 сообщений из 10, страница 1 из 1
19.11.2003, 07:42
    #32328112
Kirill Cherkasov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
Привет всем.
Помогите, кто может.
Нужно динамически в процедуре составить запрос и выполнить его, как это можно сделать? Запрос должен составляться в текстовой переменной (имя таблицы и полей передаются как параметры).
...
Рейтинг: 0 / 0
19.11.2003, 09:21
    #32328168
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
Есть датаблейд который это умеет.

Exec SQL BladeLet
...
Рейтинг: 0 / 0
10.12.2003, 21:57
    #32349927
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
Буквально на днях увидел "изобретение" одного индуса (Игорь, привет :))
на эту тему. Почитай, может поможет.


Using Dynamic Sql in Stored Procedure
---------------------------------------
vpshriyan
Location: Mumbai, India
---------------------------------------

One of the major drawback of Informix Stored Procedure is it's inability to perform dynamic SQL. A SP is parsed & optimized when compiled, preventing the use of dynamic SQL.
Here is an attempt to make a workaround stored procedure which attempts to insert a row for any table, any column dynamically. The inbound parameters are table name and dynamic number of column values.
Sample SP considers max of 5 column values, but you can edit it to suit according to your need. Data once passed, committed. There no provision to rollback. Should something go wrong, the exception handler pushes an internal rollback mechanism, hence data will not be committed. In such cases SP returns non-zero value, implying failure. Please note that the invoked SYSTEM command creates a separate transaction of its own.
The Informix SYSTEM statement provides the ability to execute any operating system command from within a stored procedure. A word of caution though, of the overhead required to execute an operating system command, the SYSTEM command should be avoided in routines with tight performance requirements. Use this procedure on your own cost and risk.

create dba procedure dynamic_insert(xtabname varchar(18),x1 varchar(64),x2 varchar(64),x3 varchar(64),x4 varchar(64),x5 varchar(64)) returning smallint;

define xowner, xdb varchar(18);
define xcols, xcoltype, xtabid, i smallint;
define xsql varchar(255);

on exception
--check for failure.
raise exception -746, 0, xtabname||": insert failed.";
return 1;
end exception

select owner,ncols,tabid into xowner,xcols,xtabid from systables where tabname=xtabname;
if xowner is null or xowner[1,1]=" " then
raise exception -746, 0, xtabname||" table does not exists.";
return 1;
end if

let xsql="insert into "||xtabname||" values (";

for i=1 to xcols
select coltype into xcoltype from syscolumns where tabid=xtabid and colno=i ;
if ( xcoltype=0 or xcoltype=7 or xcoltype=10 or xcoltype=13 ) then
if i=1 then
let x1="'"||x1||"'" ;
end if
if i=2 then
let x2="'"||x2||"'" ;
end if
if i=3 then
let x3="'"||x3||"'" ;
end if
if i=4 then
let x4="'"||x4||"'" ;
end if
if i=5 then
let x5="'"||x5||"'" ;
end if
end if
end for

if xcols=1 then
let xsql=xsql||x1 ;
end if
if xcols=2 then
let xsql=xsql||x1||","||x2 ;
end if
if xcols=3 then
let xsql=xsql||x1||","||x2||","||x3 ;
end if
if xcols=4 then
let xsql=xsql||x1||","||x2||","||x3||","||x4 ;
end if
if xcols=5 then
let xsql=xsql||x1||","||x2||","||x3||","||x4||","||x5;
end if

let xsql=xsql||")";

select trim(odb_dbname) into xdb from sysmaster:sysopendb
where odb_sessionid=dbinfo('sessionid') and odb_iscurrent='Y';

system 'echo "begin;set lock mode to wait;'||xsql||';commit"'|| '|$INFORMIXDIR/bin/dbaccess '||xdb ;
return 0;

end procedure;

Regards,
Shriyan


Last edited by vpshriyan on 12-09-03 at 07:52
...
Рейтинг: 0 / 0
13.01.2004, 16:24
    #32374743
alex_dorin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
Вызов

system 'echo "begin;set lock mode to wait;'||xsql||';commit"'|| '|$INFORMIXDIR/bin/dbaccess '||xdb ;

наверное для UNIX.
A как это будет для WIN ?
...
Рейтинг: 0 / 0
13.01.2004, 16:29
    #32374760
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
У меня виндового сервера нет, но думаю, что точно также :-).
system 'echo "begin;set lock mode to wait;'||xsql||';commit"'|| '|%INFORMIXDIR%\bin\dbaccess '||xdb ;
...
Рейтинг: 0 / 0
13.01.2004, 16:35
    #32374767
alex_dorin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
system 'echo "begin;set lock mode to wait;'||xsql||';commit"'|| '|$INFORMIXDIR/bin/dbaccess '||xdb ;

я исползовал xdb с именем БД,
строка xsql собрана правильно,
под WIN идет сообщение : директория или файл не найден
...
Рейтинг: 0 / 0
13.01.2004, 16:46
    #32374786
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
Дык, я же написал "%INFORMIXDIR%\bin\dbaccess". Кто виноват, что Билли решил использовать обратный слещ, а $ засовывать в карман?
...
Рейтинг: 0 / 0
13.01.2004, 17:39
    #32374879
alex_dorin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
let xdb = 'rs';
system 'echo "begin;set lock mode to wait;'||xsql||';commit" '||'|%INFORMIXDIR%\bin\dbaccess ' || xdb ;

результат тот же
подскажите где ошибка ?
...
Рейтинг: 0 / 0
13.01.2004, 17:59
    #32374913
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
А переменная xsql так и осталась NULL ?
Перед тем как начать воевать с dbaccess предлагаю разобраться что делает данное выражение.
Для этого выполним:
system 'date /T >>c:\aaa.txt'; -- работает ли вообше System ?
system 'echo %INFORMIXDIR% >>c:\bbb.txt'; -- установленна ли переменная окружения ?
system 'dir %INFORMIXDIR%\bin >>c:\ccc.txt'; -- а есть ли там вообще dbaccess ?

Далее посмотрим на результаты в файлах c:\aaa.txt, c:\bbb.txt, c:\ссс.txt на сервере.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
05.10.2005, 19:00
    #33307356
Bill'и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое построение SQL запросов
Daugava alex_dorinsystem 'echo "begin;set lock mode to wait;'||xsql||';commit"'|| '|$INFORMIXDIR/bin/dbaccess '||xdb ;

я исползовал xdb с именем БД,
строка xsql собрана правильно,
под WIN идет сообщение : директория или файл не найден

Дык, я же написал "%INFORMIXDIR%\bin\dbaccess". Кто виноват, что Билли решил использовать обратный слещ, а $ засовывать в карман?
Да-да, и про проценты не забудьте... :)
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Динамическое построение SQL запросов / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]