A primeira publicação continha apenas funções para consulta.
Agora, já há disponivel funções que permitem alterar os dados de uma base remota, a partir de uma sentença SQL, Procedure ou Trigger, dentro do Firebird.
Separei em 2 conjuntos de UDF, o primeiro, que não precisa de transações, com apenas 1 função, e o segundo conjunto, mais complexo, com 5 funções.
Sem necessidade de transações:
-ExecSQL(:conn, :SQL);
Executa o SQL de alteração de dados.
Onde :conn é uma string de conexão, com o nome da fonte de dados cadastrada no ODBC. E :SQL é a string com a senteça a ser executada (insert, updade ou delete).
Retorna 1 em caso de sucesso.
Exemplo:
Select execsql('DBNAME', 'Update table_name Set field2 = ''ONE STRING'' Where field1 = 322439 ') From RDB$Database
Funções que trabalha dentro de transações:
-BEGINTRANS(:conn);
Inicia a transação.
Onde :conn é a string de conexão.
Retorna o numero da Sessão iniciada.
-ADDBATCH(:idSession, :sql);
Adiciona uma sentença SQL à fila.
Onde: :idSession é um integer e :sql é a string contendo a sentença sql.
Retorna 1 em caso de sucesso, 0 se houver erro.
-EXECBATCH(:idSession)
Executa as sentenças SQL que foram adicionados à fila pelo ADDBATCH.
Retorna 1 em caso de sucesso.
-COMMITTRANS(:idSession)
ou
-ROLLBACKTRANS(:idSession)
Fazem o Commit ou Rollback na transação.
Quando executados, a sessão será finalizada.
Segue uma procedure contendo um exemplo de uso da UDF com transações.
A chamada da procedure:
Execute Procedure DBLINKEXECSQL ;
Dependencias, além das UDF:
CREATE EXCEPTION X_STOP '';
Para criar:
CREATE PROCEDURE DBLINKEXECSQL
AS/**/
declare idSessao Integer ;
declare qtdIns Integer ;
declare resp Integer ;
declare ERRMSG Varchar(1024) ;
declare CD_LGR Integer ;
declare DS_TPLGR varchar(100) ;
declare DS_LGR varchar(100) ;
declare NM_USR varchar(100) ;
declare DT_CDS timestamp ;
declare SG_ALT varchar(3) ;
declare NR_CEP varchar(15) ;
begin
idSessao = begintrans('EMHA');
if (idSessao = 0) then
begin
ERRMSG = getErr(:idSessao) ;
exception x_stop 'idsessao=0. '|| ERRMSG ;
end
for Select CD_LGR,DS_TPLGR,DS_LGR,NM_USR,DT_CDS,SG_ALT,NR_CEP
From T_Lgr
Into CD_LGR,DS_TPLGR,DS_LGR,NM_USR,DT_CDS,SG_ALT,NR_CEP
do
begin
DS_LGR = replace(DS_LGR,'''','´') ;
qtdIns = addbatch(:idSessao,
'Insert Into T_Lgr (CD_LGR,DS_TPLGR,DS_LGR,NM_USR,DT_CDS,SG_ALT,NR_CEP) Values ('
||:CD_LGR ||','''|| :DS_TPLGR ||''','''|| :DS_LGR
||''','|| Coalesce(''''||:NM_USR||'''','NULL') ||','|| Coalesce(''''||:DT_CDS||'''','NULL') ||','''||:SG_ALT
||''','|| Coalesce(''''||:NR_CEP||'''','NULL')
||')'
) ;
if (qtdIns = 0) then
begin
ERRMSG = getErr(:idSessao) ;
exception x_stop 'qtdIns=0. '|| ERRMSG ;
end
end
resp = execbatch(:idSessao) ;
if (resp = 0) then
begin
resp = rollbacktrans(:idSessao) ;
ERRMSG = getErr(:idSessao) ;
exception x_stop 'execbatch. '|| ERRMSG ;
end
resp = committrans(:idSessao) ;
if (resp = 0) then
begin
ERRMSG = getErr(:idSessao) ;
exception x_stop 'committrans. '|| ERRMSG ;
end
end
Nenhum comentário:
Postar um comentário