MagistrAnatol
![](http://forum.ru-board.com/board/avatars/p149.gif)
Silver Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору dimm78 Спасибо, попробую. Еще такой вопрос. Изобретаю велик для репликации баз, вот процедура для получения данных из таблиц Код: SET TERM ^ ; create or alter procedure GET_QUERY ( TBL_NAME varchar(20), TBL_ID integer, TBL_OPER integer) returns ( TXT blob sub_type 1 segment size 80) as declare variable FLD_NAME varchar(40); declare variable FLD_TYPE integer; declare variable FLD_VALUE varchar(9999); declare variable Q_TEXT varchar(9999); declare variable SEPARATOR varchar(2); declare variable FLD_LIST varchar(9999); declare variable FLD_VALUES varchar(9999); begin txt=''; SEPARATOR=''; FLD_LIST=''; FLD_VALUES=''; for select R.RDB$FIELD_NAME,F.RDB$FIELD_TYPE from RDB$FIELDS F, RDB$RELATION_FIELDS R where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and R.RDB$SYSTEM_FLAG = 0 and upper(trim(R.RDB$FIELD_NAME))<>upper(trim(:TBL_NAME||'_ID')) and upper(trim(R.RDB$RELATION_NAME)) = upper(trim(:tbl_name)) order by R.RDB$FIELD_POSITION into :fld_name,:fld_type do begin fld_name=trim(fld_name); q_text ='select '||fld_name||' from '||tbl_name||' where DB_ID='||tbl_id; execute statement q_text into :fld_value; if (fld_type in (12,35,37,261) and fld_value is not null) then fld_value=''''||fld_value||''''; if (fld_value is null) then fld_value = 'null'; fld_value=trim(fld_value); txt = txt || SEPARATOR || fld_name || ' = ' ||fld_value; FLD_VALUES = FLD_VALUES || SEPARATOR || fld_value; FLD_LIST = FLD_LIST || SEPARATOR || fld_name; if (SEPARATOR='') then SEPARATOR = ','||ascii_char(10); end -------------------------------------------------------------------------------- if (tbl_oper=1) then txt='insert into '||tbl_name||'('||FLD_LIST||')'||ascii_char(10)||' values('||ascii_char(10)||FLD_VALUES||');'; -------------------------------------------------------------------------------- if (tbl_oper=2) then txt='update '||tbl_name||' set '||ascii_char(10)||' '||txt||ascii_char(10)||' where DB_ID='||tbl_id||';'; -------------------------------------------------------------------------------- if (tbl_oper=3) then txt='delete from '||tbl_name||' where DB_ID='||tbl_id||';'; -------------------------------------------------------------------------------- FLD_VALUES = ''; FLD_LIST = ''; suspend; txt = ''; end^ SET TERM ; ^ COMMENT ON PARAMETER GET_QUERY.TBL_OPER IS '1- insert,2-update,3-delete'; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE GET_QUERY TO TRIGGER ZMINU_AI0; GRANT EXECUTE ON PROCEDURE GET_QUERY TO TRIGGER ZMINU_BD0; GRANT EXECUTE ON PROCEDURE GET_QUERY TO PROCEDURE INS_INTO_REPL; GRANT EXECUTE ON PROCEDURE GET_QUERY TO SYSDBA; | Вызов через триггер Код: if (INSERTING) THEN EXECUTE PROCEDURE INS_INTO_REPL('ADS_OPER', new.db_id, 1); if (UPDATING) THEN EXECUTE PROCEDURE INS_INTO_REPL('ADS_OPER', new.db_id, 2); if (DELETING) THEN EXECUTE PROCEDURE INS_INTO_REPL('ADS_OPER', old.db_id, 3); | По логике - все операции заносятся в блоб поле определенной таблицы. Все отлично работает за одним нюансом - если в каком-то блоб поле любой из табличек есть символ перевода строки - скрипт не выполняется. Само блоб поле передаю как строку заключенную в кавычки - Код: update ADS_OPER set ..., OPYS = 'ісячс фяскяуцс ', ..., DB_ID = 30000014 where DB_ID=30000014; | посоветуйте как передать блоб поле в скрипт с дальнейшим его выполнением. Думал кодировать в Base64 - но!!! - в Firebirde не нашел такой ф-ции, но даже если самому написать функцию записать то запишу, но как потом выполнить скрипт ??? Спасибо Добавлено: В догонку к предыдущему вопросу - в IBExpert есть процедуры Код: execute ibeblock as begin ClientDBParams = 'DBName=' + ibec_trim(ibec_ds_getfield(tClient,0))||':'+ibec_trim(ibec_ds_getfield(tClient,3)) + ';' + 'User=' + ibec_trim(ibec_ds_getfield(tClient,1)) + ';' + 'Password=' + ibec_trim(ibec_ds_getfield(tClient,2)) + ';' + 'Names=WIN1251;' + 'ClientLib=' + 'c:\Program Files\Firebird\Firebird_2_5\bin\fbclient.dll'; ClientDB = ibec_CreateConnection(__ctFirebird, ClientDBParams); ibec_UseConnection(ClientDB); execute statement 'delete from FRX_TEMPLATE'; commit; | Если я правильно понимаю ibec_CreateConnection - ето чисто ибекпертовская процедура, а есть что-то похожее нативное Firebird-а? |