[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