[firebase-br] Criação de Procedure Recursiva, equivalencia a Row_Number() e Updates Complexos

Pha lista em pha.com.br
Qua Ago 31 16:19:07 -03 2005


Abaixo.

PHA 
Nova Odessa / SP - Brazil
Membro do TeamFB (FireBase)


Citando Marcos Thomaz <thomazs em ufac.br>:

> Antes de tudo, desculpem o post ser tão longo, mas não encontrei forma
> melhor de me expressar, que ficasse clara (pelo menos ao meu ver).
> 
> Dúvida 1 - Criação de Procedure Recursiva
> ------------------------------------------------
> Pessoal, alguém saberia me dizer se eu poderia criar uma procedure que faça
> referência a ela mesma??
> Tipo assim:
> 
> CREATE PROCEDURE MVALOR( N INTEGER, MAXIMO INTEGER)
> RETURNS ( VAL1 INTEGER)
> AS
> BEGIN
>   VAL1 = N+1;
>   IF (VAL1 <MAXIMO) THEN
>     SELECT VAL1 FROM MVALOR( :N + 1 , :MAXIMO ) INTO VAL1
>   SUSPEND;
> END
> 
> 

E so voce chamar a procedure de dentro dela mesmo, passando os parametros, se
nao estou enganado o FB limita a 1000 chamadas. 

> 
> 
> Dúvida 2 - Equivalencia a Row_Number()
> -------------------------------------------
> 
> Pessoal, no DB2, tenho a função Row_Number, que me traz o número da linha no
> select, mediante a ordem natural do select, ou uma ordem a minha escolha.
> Por exemplo:
> Na tabela tenho os valores
> Nome    Valor
> José        100,00
> Antonio   200,00
> 
> Então se eu colocasse:
> Select Row_Number() Over() as Row_Number, Nome, Valor From Tabela    seria
> retornado:
> 1 José       100,00
> 2 Antonio 200,00
> 
> Select Row_Number() Over(Order By Nome) as Row_Number, Nome, Valor From
> Tabela    seria retornado:
> 2 José       100,00
> 1 Antonio 200,00
> 
> Existe algo equivalente no Firebird, ou alguma forma de ter esse número da
> linha??
> 

Ate o momento nao, voce tera que fazer um Stored Procedure selecionavel.

Procure por FOr SELECT nos manuais.

> 
> 
> Dúvida 3 - Updates Complexos
> ----------------------------------------
> 
> No DB2 temos uma instrução do update do tipo:
> UPDATE TABELA SET (CAMPO1,CAMPO2) = (SELECT CAMPOT1, CAMPOT2 FROM TABELA2
> WHERE CAMPOT1> 50 )
> 
> Essa instrução atualiza o campo 1 e campo 2 da tabela, pegando
> automaticamente os valores da tabela 2.

Ainda não, mais deveria existir, pois e muito util em qualquer banco.

O FB so permite um unico campo

UPDATE TABELA 
SET CAMPO1 = (SELECT CAMPOT1 FROM TABELA2
WHERE CAMPOT1> 50 ),
SET CAMPO2 = (SELECT CAMPOT2 FROM TABELA2
WHERE CAMPOT1 > 50 )

> 
> Ouvi dizer também a respeito da Utilização de Joins em Updates e Deletes
> alguém poderia me informar como isso funciona????
> 

Funciona da mesma for que o DB2.

O DB2 não permite na tabela que esta sendo feito o Update, correto?

Deve ser utilizar a clausula where (Exists, Select, In, etc)

> 
> 
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> 






Mais detalhes sobre a lista de discussão lista