Páginas

quinta-feira, 27 de novembro de 2014

Funções para alteração dos dados - (pt-br)

Após publicar a biblioteca de funções externas (UDF) de Database Link, acrescentei algumas novas funções.
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