[firebase-br] "DO SUSPEND"

Gladiston Santana gladiston.santana em gmail.com
Sexta Setembro 22 18:48:51 -03 2023


Olá Mario,

Você faz acesso a dados externos desde que estes "outros" databases também
sejam Firebird, eu tenho aplicação rodando assim então funciona tranquilo.
Inclusive meus logs de operações importantes são registrados num database
diferente de onde as operações aconteceram.
Agora se o acesso fosse a outros databases como Oracle, DB2, MSSQL aí não
teria como fazê-lo, aí você teria que inverter a ordem, por exemplo, no
caso do MSSQL você pode fazer operações de leitura/escrita no firebird,
pois o MSSQL permite acesso a qualquer outro database desde que tenha uma
fonte(datasource) definida lá no ODBC. O Firebird ainda não faz isso, só
acessa databases externos que também sejam firebird.
Um trecho tirado de uma procedure minha é assim:
        EXECUTE STATEMENT :RET_CONN_SQL
          ON EXTERNAL :RET_CONN_STRING
          AS USER :RET_CONN_USER
          PASSWORD :RET_CONN_PASSWORD
          ROLE :RET_CONN_ROLE into :result_value ;
onde RET_CONN_SQL é um statement de insert(...)values(...) returning
id_campo que será recebido por :result_value  de mesmo tipo.

Tenha paciência pq quando não funciona é erro de sintaxe, as malditas
aspas, senha errada, falta de permissão,... acontece que a mensagem de erro
do EXECUTE STATEMENT é extremamente genérica quando é sintaxe e isso
confunde.
Quando tenho problemas, eu comento o EXECUTE STATEMENT e no lugar dele
disparo uma exception onde a mensagem de erro é a quer que tava tentando:
exception ERR  :RET_CONN_SQL  ;
Ou então dou um suspend para retornar a query para minha aplicação, daí
analiso com o cuidado, geralmente comigo são os pares campo/valor do INSERT
que saem fora de ordem seja por falta de virgula ou uma aspas simples
quebrando a sentença.
[]´s

Em sex., 22 de set. de 2023 às 11:57, Mário Reis <mariodosreyx em gmail.com>
escreveu:

> Gladiston
> Boas tardes
> Não será exactamente assim! Estou a fazer testes e dentro do bloco o FB vê
> a mesma tabela
> a gente precisa ter como dar um alias à external database e outro a
> Internal
> para fazer por exemplo *A.*externaldabase.Pessoas....          *B.*InternalDataBase.Pessoas
>  (acho que já vi isto assim, não lembro mais se MySql ou se IBM DB2
> FOR
>    EXECUTE STATEMENT
>       ( :sSql )
>       ON EXTERNAL DATA SOURCE :sDB
>       AS USER :IN_USER PASSWORD :IN_PWD -- just for example
>       WITH *common* TRANSACTION -- note autonomous transaction
>       INTO :PESSOA_ID, :TITULO_ID, :APELIDO, :NOME, :TIPO_ID etc..
> Do Begin
> -- Fazer *aqui dentro deste bloco* e o firebird
> --tenta inserir na mesma database ou seja, na external database
> --quando o que eu preciso é inserir na base de dados corrente
> -- Seja como COMMON ou AUTONOMUS Transaction o resultado é o mesmo
> -- tenta introduzir na tabela pessoas da external database!!!
>  /*  INTERNAL DATA SOURCE */
> INSERT INTO PESSOAS (
>     PESSOA_ID,
>     TITULO_ID,
>     APELIDO,
>     NOME,
>     TIPO_ID)
> Values(
>     :PESSOA_ID,
>     :TITULO_ID,
>     :APELIDO,
>     :NOME,
>     :TIPO_ID)
> end
> Não sei ainda como resolver. Se criar uma nova Procedure de onde irei
> chamar esta e então quando voltar à primeira, fazer o INSERT.
> Todavia penso que vai ser um processo muito mais pesado digo demorado sem
> falar do trabalho (o copy paste) dos parâmetros hão-de ajudar!
> Talvez?!
>
> Com os meus melhores cumprimentos
> Mário Agostinho Reis
> 919262146
>
> Esta mensagem contém informação de natureza confidencial e é
> exclusivamente dirigida ao(s) destinatário(s) indicado(s). Se, por engano,
> receber este email agradecemos que não o copie nem o reenvie e que nos
> notifique do ocorrido através do email de resposta.
>
>
> Gladiston Santana <gladiston.santana em gmail.com> escreveu no dia sexta,
> 22/09/2023 à(s) 14:36:
>
>> Isso mesmo!
>> Ou antes do insert modificar os valores recebidos, recalcular e só então
>> aplicar o insert.
>>
>> Em qui., 21 de set. de 2023 às 21:51, Mário Reis <mariodosreyx em gmail.com>
>> escreveu:
>>
>>> Se não tem  outra forma de ir buscar dados a uma DB externa sem o
>>> "execute statement" o "For" vai fazer n' vezes tantas quantas verificarem a
>>> condição, certo? Então com o recurso a um Begin e antes do End posso fazer
>>> igual n⁰ insert INTO minha tabela.
>>> Compreendi bem? Obrigado
>>>
>>> A quinta, 21/09/2023, 19:14, Gladiston Santana <
>>> gladiston.santana em gmail.com> escreveu:
>>>
>>>> Saudações além-mar Mário,
>>>>
>>>> O suspend retorna uma linha de dados conforme o RETURNS indicado no
>>>> cabeçalho da procedure, então se você fizer uma procedure assim:
>>>> CREATE or alter PROCEDURE SP_ABOUT
>>>> RETURNS (
>>>>     NOME varchar(120),
>>>>     EMAIL varchar(255)
>>>>     )
>>>> AS
>>>> BEGIN
>>>>   NOME  = 'GLADISTON SANTANA';
>>>>   EMAIL = 'gladiston.santana [em] gmail.com';
>>>>   SUSPEND;
>>>> END
>>>>
>>>> Se fizer  SELECT * FROM SP_ABOUT irá retornar uma linha contendo NOME e
>>>> EMAIL, mas se voce apenas comentar o SUSPEND não irá retornar nada!
>>>> Quando voce usar um FOR...SELECT...DO, você esta experimentando ler uma
>>>> linha por vez do seu select, muita gente abriria após o DO um begin...end e
>>>> só faria o SUSPEND nas linhas que desejam ser retornadas, quando o camarada
>>>> não poe nenhum BEGIN/END e já faz um SUSPEND ele intenciona retornar todos.
>>>> O problema com o 'execute statement' é que a query deve ter os mesmos
>>>> parâmetros de entrada (select....) e saida( into xxx) e ainda por cima
>>>> corresponder a cada RETURNS do cabeçalho da procedure. Quanto mais campos
>>>> indicar, maiores as chances de errar. Quando eu faço o que você está
>>>> fazendo, eu idento linha-a-linha e confiro as correspondências no INTO e
>>>> RETURNS pq é complicado enxergar erro de sintaxe na sequência.
>>>>
>>>> []´s
>>>>
>>>
>>
>> --
>> Gladiston Santana
>> Escritório: 4787-3122 Ramal 228
>> Cel Tim/WhatsApp: (11)95144-8188
>>
>

-- 
Gladiston Santana
Escritório: 4787-3122 Ramal 228
Cel Tim/WhatsApp: (11)95144-8188


Mais detalhes sobre a lista de discussão lista