none
Script Oracle para SQL RRS feed

  • Pergunta

  • Estou precisando fazer o script abaixo que está em Oracle no SQL Server. A parte onde está sendo criado a tabela e inserindo os dados tudo bem, isso está sem problemas, o problema é na segunda parte, onde está sendo criado um cursor. Se alguém puder me ajudar a fazer isso agradeço.

    // Parte de criação da tabela e inserção dos dados

    CREATE TABLE dados
    (  ID                   NUMBER(10),    DESCRICAO
       VARCHAR2(30),
       META             NUMBER(10,2),
       SENTENCA     VARCHAR2(100),
       RESULTADO   NUMBER(10,2)
    );

    INSERT INTO dados VALUES( 1, 'Meta Fat.Junho', 10000, 'Select sum(faturamento) from pedt00 where mes = 6 and ano = 2006',0);
    INSERT INTO dados VALUES( 2, 'CP para 2006', 1000000, 'Select sum(contaspagar) from pagt00 where ano = 2006',0);

    COMMIT;

     

    // Parte de criação do cursor

    DECLARE

       -- montar cursor com os registros da tabela.
       CURSOR curDados IS
              SELECT id, sentenca
                FROM dados;

       -- resultado.
       nResultado  NUMBER(10,2);
      
    BEGIN

       -- todos os registros.
       FOR reg IN curDados LOOP

              -- executar o select e recuperar o resultado.
              EXECUTE IMMEDIATE reg.sentenca
                                        INTO nResultado;

              -- atualizar a tabela.
              UPDATE dados
                    SET  resultado = nResultado
             WHERE   id = reg.id;

              -- efetivar.
             COMMIT;
      
       END LOOP;

    END;
    /

    segunda-feira, 26 de junho de 2006 17:20

Todas as Respostas

  •  

     veja se assim, ajuda.

     

    CREATE TABLE dados
    (  ID               numeric(10),   
       DESCRICAO   VARCHAR(30),
       META             numeric(10,2),
       SENTENCA     VARCHAR(1000),
       RESULTADO   numeric(10,2)
    )


    INSERT INTO dados VALUES( 1, 'Meta Fat.Junho', 10000, 'Select sum(faturamento) from pedt00 where mes = 6 and ano = 2006',0);
    INSERT INTO dados VALUES( 2, 'CP para 2006', 1000000, 'Select sum(contaspagar) from pagt00 where ano = 2006',0);


    Create Table #Resultados (Resultado Numeric(10,2))

    Declare @Start Int
    Declare @End   Int
    Declare @Retorno Numeric(10,2)
    Declare @TSql Varchar(1000)
    Declare @Loop Table (Idx int identity(1,1), [ID]  Numeric(10), Sentenca Varchar(1000))
    Insert into @Loop (sentenca, [ID] ) Select Sentenca, [ID] From dados

    While @Start <= @End
    Begin
      Select @TSql = sentenca From @Loop where idx = @Start
      exec sp_executesql @TSql, N'@Retorno Numeric(10,2) OUTPUT', @Retorno  OUTPUT
      Update Dados Set resultado = @Retorno
      From Dados Inner join @Loop Lp On Lp.ID = Dados.ID And Lp.idx = @Start
     Set @Start = @Start + 1
    End

    segunda-feira, 26 de junho de 2006 18:28
  • Marcelo,

    Fiz da forma que você postou, não deu nenhum erro mas também não trouxe resultado nenhum. Aí achei estranho uma coisa, a váriavel @End não recebe nenhum valor, isto está certo, pois na comparação para entrar no loop do while pode estar dando problema aí, certo?? Abraços

    Rogério Mendes

    terça-feira, 27 de junho de 2006 17:24
  •  

     

     Opa ta faaltando sim, acho que copiei errado, deveria ter uma linha antes do while assim

     

    select @start = 1, @end = Max(idx) from @loop

     

    Veja ai qualquer coisa retorne, usei a sp_executesql em substituicao ao execute immediate do oracle, acho que server bem neste caso.

     

    Abs.

    terça-feira, 27 de junho de 2006 21:59
  • Marcelo,

    Fiz o processo e o resultado segue abaixo.

    O que pode ser essa mensagem que deu no final?

    Obrigado

     

    Resultado:

    (1 row(s) affected)

    (1 row(s) affected)

    (2 row(s) affected)

    Server: Msg 214, Level 16, State 2, Procedure sp_executesql, Line 28 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

    quarta-feira, 12 de julho de 2006 20:23
  •  

     Cara ele chegou a fazer algum update ?, quer me ligar para gente trocar uma ideia, manda um email para mim mcolla@bol.com.br que eu respondo com meu telefone para gente conversar.

    Abs.

    quinta-feira, 13 de julho de 2006 10:16