[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