Fórum PROC DO FIREBIRD NO SQL SERVER #61200

18/03/2010

0

OLA PESSOAL COMO EU FAÇO ISSO FUNCIONAR NO SQL SERVER   PROC NO FIREBIRD FUNCIONANDO PERFEITA   create or alter procedure PRC_CRIATRAJETOS
as
declare variable V_BAIRRO_A varchar(100);
declare variable V_BAIRRO_B varchar(100);
begin
   for  select nm_bairro from tb_bairro into  :v_bairro_a
   do
   begin
     for select nm_bairro from tb_bairro into :v_bairro_b
     do
   begin
     insert into tb_trajeto (ds_trajeto) values (:v_bairro_a ||'/'||:v_bairro_b) ;
   end    end
END^     ESSA PROC AQUI FOI CRIADA NO FIREBIRD E FUNCIONA 100%   AQUI NO SQL SERVER ACHO QUE É MAIS OU MENOS POR AQUI   CREATE PROCEDURE PRC_ROTA
 AS
 DECLARE @BAIRRO_I VARCHAR (100)
 declare @Bairro_f varchar (100) DECLARE CUR_ROTA_I CURSOR FOR SELECT NM_BAIRRO FROM TB_BAIRRO
declare CUR_ROTA_F CURSOR FOR SELECT NM_BAIRRO FROM TB_BAIRRO
--BEGIN TRANSACTION
OPEN CUR_ROTA_I FETCH NEXT FROM CUR_ROTA_I INTO @bairro_i
OPEN CUR_ROTA_F FETCH NEXT FROM CUR_ROTA_F INTO @BAIRRO_F
   WHILE @@FETCH_STATUS = 0
     BEGIN
     INSERT INTO TB_ROTA (DS_ROTA)  VALUES (@BAIRRO_I+'/'+ @BAIRRO_F)
     INSERT INTO TB_ROTA (DS_ROTA)  VALUES (@BAIRRO_F+'/'+ @BAIRRO_I)
          FETCH NEXT FROM CUR_ROTA_I INTO @BAIRRO_I
           FETCH NEXT FROM CUR_ROTA_I INTO @BAIRRO_F
  END
       
   BEGIN
   SELECT * FROM TB_ROTA
   END
CLOSE CUR_ROTA_I
DEALLOCATE CUR_ROTA_I
--COMMIT TRANSACTION
  OBSERVACAO AQUI NO SQL ATE QUE TA FUNCIONANDO MAIS NAO ESTA FAZENDO O LOOP ,EXEMPLO SE EU TENHO 100 BAIRROS NA TABELA BAIRRO E QUERO CRIAR UMA DESCRICAO DE ROTA ENTRE TODOS EXEMPLO   TB_BAIRRO   COPACABANA IPANEMA LEBLON   TB_ROTAS SERIA  ESTE SERIA O RESUTADO DA PROCEDURE EU NAO PRECISARIA PASSAS NENHUM PARAMETRO ELA IRIA PEGAR O PRIMEIRO BAIRRO DA TABELA , ESCREVER NA TB_ROTAS 1º BAIRRO DA TABELA + '/+ PRIMERIO BAIRRO DA TABLE PRIMERIO BAIRRO DA TABELA + SEGUNDO BAIRRO DA TABELA E POR AI EM DIANTE.     COPACABANA/COPACABANA COPACABANA/IPANEMA COPACABANA/LEBLON IPANEMA/COPACABANCA IPANEMA/IPANEMA IPANEMA/LEBLOM LEBLON/COPACANA LEBLON/IPANEMA LEBLON/LEBLON   O EXEMPLO ACIMA EM FIREBIRD FAZ EXATAMENTE ISSO TA REDONDO      
Carlos Faria

Carlos Faria

Responder

Posts

18/03/2010

Rodrigo Mourão

Olá, segue:

CREATE PROCEDURE PRC_ROTA
 AS
DECLARE @BAIRRO_I VARCHAR (100)
DECLARE @BAIRRO_F VARCHAR (100)
DECLARE C_BAIRRO_I CURSOR FOR (SELECT NM_BAIRRO FROM TB_BAIRRO)
DECLARE C_BAIRRO_F CURSOR FOR (SELECT NM_BAIRRO FROM TB_BAIRRO)


OPEN C_BAIRRO_I
  FETCH NEXT FROM C_BAIRRO_I INTO @BAIRRO_I
  WHILE @@fetch_status = 0
  BEGIN
    OPEN C_BAIRRO_F
    FETCH NEXT FROM C_BAIRRO_F INTO @BAIRRO_F
    WHILE @@fetch_status = 0
    BEGIN
      INSERT INTO TB_ROTA (DS_ROTA)  VALUES (@BAIRRO_I+'/'+ @BAIRRO_F)
      FETCH NEXT FROM C_BAIRRO_F INTO @BAIRRO_F
    END
    CLOSE C_BAIRRO_F
    DEALLOCATE C_BAIRRO_F
    FETCH NEXT FROM C_BAIRRO_I INTO @BAIRRO_I
  END
CLOSE C_BAIRRO_I
DEALLOCATE C_BAIRRO_I

Responder

Gostei + 0

18/03/2010

Carlos Faria

Ola Rodrigo a proc funcionou do mesmo jeito que a minha funcionou errao   ela pegou o bairo x e ligou com todos os outros so que na verdade se eu tenho 121 bairros na tb_bairro o result tem que ser 121 ao quadrado ou 121 * 121 = 14641    o insert dessa proc me trouxe 121 registros   tem que haver um loop onde exe   1º bairro 2º bairro 3º bairro ..................   ................ 1 /1 1/2 1/3   2/1 2/2 2/3   3/1 3/2 3/3   do jeito que ta a proc ela so retorna o exemplo em negrito    
Responder

Gostei + 0

19/03/2010

Carlos Faria

Ola Rodrigo
Ja ouviu dizer é vivendo e esquecendo ,eu ja estava tao acostumado com o firebird que cara nem sei como nao vi isso.Essa rotina aqui ate minha vo que ta no tumulo faz ela .
Voce tem 121 bairros na tabela  bairro e quer fazer a union  entre todos eles. Pronto ja ta resolvido o problema
Union  (no meu caso aqui que tenho 121 bairro elevado ao quadrado vai dar 14641 ) basta fazer um produto carteziano select a.nm_bairro +'/'+b.nm_bairro as Rotas
from tb_bairro a
cross join tb_bairro b Nem sei cara como nao pensei nisso , mas vamos fazer o seguinte agora eu quero fazer isso aqui tambem pelo cursor , eu fiquei umas 3 horas tentando essa rotina e nao consegui com o cursor e claro ne para inserir insert into tb_rota (ds_rota)values select a.nm_bairro +'/'+b.nm_bairro as Rotas
from tb_bairro a
cross join tb_bairro b
Mais nao se empolga nao , que eu quero fazer isso no cursor funcionar , so to postando isso pq eu e vc , nao percebemos o quanto era facil e tava o tempo todo na cara e agente procurou o caminho mais dificil creio eu   o curor nao ta funcinando nao ta multiplicando os 121 * 121 ele ta fazendo 121*1  pegue todos os bairros e insere junto com o primeiro da tabela
Responder

Gostei + 0

19/03/2010

Rodrigo Mourão

kkkkkkkkkkkkkkkkk

Cara tem razão, mas e que quando o cliente abra o chamado a gente fica tao vidrado no problema que nem vemos outro solucao,

MAs esta funcionando, conseguiu faer isso no cursor??? Precisa de algo mais??

Att,

Responder

Gostei + 0

19/03/2010

Carlos Faria

Sim preciso fazer funcionar no cursor tambem ,questao de honra agora , eu fiquei quase um dia todo e nao consegui fazer inserir via cursor   o exemplo que voce fez ele nao faz o produto carteziano , alias ele ate faz mais so do primerio registro sendo assim nao e um carteziano.   Depois de tanto sofrimento agora eu preciso fazer isso funcionar via cursor rs , fico aguardando  
Responder

Gostei + 0

23/03/2010

Rodrigo Mourão

Olá Carlos,

Sintaticamente esta correto, vou verificar na pratica o que pode ocorrer.

Solicito a gentuileza que aguarde.

Att,

Responder

Gostei + 0

25/03/2010

Carlos Faria

Ok quando tiver redondo vc posta ai , essa proc para mim agora e questao de honra !!
Responder

Gostei + 0

25/03/2010

Rodrigo Mourão

Olá Carlos,

Realmente o problema persiste porém não é minha especialidade banco de dados. A consultoria em Delphi não cobre assuntos de banco de dados mas como você e um cliente VIP (-: então me esforcei mas sem sucesso.

Estarei colocando o chamado como cancelado para nao consumir do seu pacote de serviços.

Att,

Responder

Gostei + 0

26/03/2010

Carlos Faria

Não precisa cancelar nao , Pode fechar  mesmo !
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar