[firebase-br] "DO SUSPEND"

Mário Reis mariodosreyx em gmail.com
Sexta Setembro 22 11:57:02 -03 2023


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
>


Mais detalhes sobre a lista de discussão lista