Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #97425
    apalmeira
    Participante

      Olá pessoal,

      Continuo com a migração do Firebird para o Oracle 10g Ex.

      Tenho a Stored Procedure abaixo funcionando no Firebird, porém, não sei como implementá-la no Oracle.

      Quando um usuário ou uma tela é cadastrada, essa procedure é chamada para incluir os dados na tabela de permissoes. Ou seja, caso seja cadastrado um novo usuário, a procedure faz vários inserts na tabela permissoes com todas as telas existentes para o novo usuario, se for cadastrado uma nova tela, a procedure faz inserts na tabela permissoes com a nova tela para os usuários existentes.

      Desde já agradeço!


      CREATE PROCEDURE CADASTRA_PERMISSAO (
      USUARIO_ID INTEGER,
      TELA_ID INTEGER)
      AS
      DECLARE VARIABLE USUARIO INTEGER;
      DECLARE VARIABLE TELA INTEGER;
      BEGIN

      IF(NOT :USUARIO_ID IS NULL) THEN
      BEGIN
      FOR
      SELECT
      ID
      FROM
      TELA
      INTO
      :TELA
      DO
      BEGIN
      INSERT INTO PERMISSAO(TELA_ID,usuario_id) VALUES (:TELA,:USUARIO_ID);
      END
      END
      ELSE IF(NOT :TELA_ID IS NULL) THEN

      BEGIN

      FOR
      SELECT
      ID
      FROM
      USUARIO
      INTO
      :USUARIO
      DO
      BEGIN
      INSERT INTO PERMISSAO(TELA_ID,USUARIO_ID) VALUES (:TELA_ID,:USUARIO);
      END

      END

      END

      #97426
      leandrolbs
      Participante

        Cara, da mesma forma que entendi tudo, eu não entendi nd…
        na realidade achei essa prc meio muita confusa..rs.

        adaptei ela no Oracle, mais to sem base no momento, qualquer coisa mande as tabelas e testo aqui…

        segue:
        CREATE PROCEDURE CADASTRA_PERMISSAO(USUARIO_ID INTEGER, TELA_ID INTEGER)
        AS
        BEGIN
        DECLARE

        IF NOT (USUARIO_ID IS NULL) THEN
        BEGIN
        FOR S IN (
        SELECT ID FROM TELA
        ) LOOP
        INSERT INTO PERMISSAO(TELA_ID, USUARIO_ID) VALUES(S.ID, USUARIO_ID);
        END LOOP;

        END IF;

        IF NOT (TELA_ID IS NULL) THEN
        BEGIN
        FOR S2 IN (
        SELECT ID FROM USUARIO
        ) LOOP
        INSERT INTO PERMISSAO(TELA_ID, USUARIO_ID) VALUES(TELA_ID,s2.ID);
        END LOOP;
        END IF;
        END;

        #97429
        rwarstat
        Participante

          Leandro,

          Fiz uma alteração na procedure que tu modificou.
          Tirei aquele os loops que haviam sido colocados e no lugar coloquei um insert into … select. Nesse caso a performance irá ficar melhor, uma vez que o loop irá causar uma demora desnecessária ao processo.

          CREATE PROCEDURE CADASTRA_PERMISSAO (USUARIO_ID INTEGER, TELA_ID INTEGER)
          AS
          BEGIN
          IF NOT (USUARIO_ID IS NULL) THEN
          INSERT INTO PERMISSAO (TELA_ID, USUARIO_ID)
          (SELECT ID, USUARIO_ID FROM tela);
          END IF;

          IF NOT (TELA_ID IS NULL) THEN
              INSERT INTO PERMISSAO (TELA_ID, USUARIO_ID)
                  (SELECT TELA_ID, ID FROM usuario);
          END IF;
          

          END;

          Abraço,
          Roberto

          #97433
          leandrolbs
          Participante

            Roberto, com certeza é rápido, minha intenção foi converter o código Fire to Oracle, mais vlw pela dica nosso amigo terá mais opções.

            #97434
            apalmeira
            Participante

              Valeu galera, funcionou perfeitamente!

              Vocês poderiam me indicar algum livro de PL/SQL?

              Abraços

              #97435
              rwarstat
              Participante

                Sinceramente de PL/SQL nunca li nenhum livro até hoje.
                O quê aprendi foi com um curso de poucas horas que me deu a noção e depois foi na internet, tanto em fóruns como vendo códigos já feitos.

                Abraço,
                Roberto

              Visualizando 6 posts - 1 até 6 (de 6 do total)
              • Você deve fazer login para responder a este tópico.