Pular para o conteúdo
  • Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 5 anos, 8 meses atrás por Avatar de José Laurindo ChiappaJosé Laurindo Chiappa.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #109372
    Avatar de fabio de queirozfabio de queiroz
    Participante

      Bom dia, preciso usar uma condição para determinar qual select será executado, como exemplo fiz o select abaixo onde se o numero for =1 executa o primeiro caso não executa o segundo, mas esta com algum erro na estrutura porque apresenta a mensagem em anexo.
      Gostaria de saber se o correto seria usar dessa forma que estou fazendo ou se tem algum outra forma de usar uma condição para escolher o select que vai ser executado.
      Obs. no final tentei de algumas formas incluindo mais um END, ou retirando o ;

      declare
      n number :=1;

      begin
      case when n=1 then

      select * From tabela1
      Where tabela1.emissao = ’31-jul-2018′
      AND tabela1.empresa =1;

      else

      select * From tabela2
      Where tabela2.emissao = ’31-jul-2018′
      AND tabela2.empresa =2;

      end;

      Attachments:
      #109373
      Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
      Moderador

        Não, colega tá completamente errado : primeiro, o CASE ** não ** pode ser usado fora de um SQL, solto no meio do bloco PL/SQL como vc propôe : pra vc fazer isso num bloco PL/SQL vc usa o IF…
        O outro ponto errado é que a partir do momento em que vc encapsulou um SELECT dentro de um bloc BEGIN/END, vc passa a programar EM PL/SQL, e na linguagem PL/SQL vc TEM que indicar em quais variáveis Pl/SQL e/ou em qual tabela onde os valores lidos na query vão ser guardados – vc RIGOROSAMENTE ** Não Pode ** ter um SELECT * FROM tabela e nada mais, vc TEM que fazer SELECT * INTO variáveis OU colocar a query dentro de um cursor…

        ==> A correção seria algo mais ou menos tipo :

        declare
        n number :=1;
        begin
        if n=1 then
        for r in (select * From tabela1
        Where tabela1.emissao = '31-jul-2018'
        AND tabela1.empresa =1
        )
        loop
        ... faço algo - exibo, guardo em variaveis ou em tabela os dados recuperados pelos cursor ...
        end loop;
        else
        for r in (select * From tabela2
        Where tabela2.emissao = '31-jul-2018'
        AND tabela2.empresa =2
        )
        loop
        ... faço algo - exibo, guardo em variaveis ou em tabela os dados recuperados pelos cursor ...
        end loop;
        end;

        []s

        Chiappa

        #109375
        Avatar de fabio de queirozfabio de queiroz
        Participante

          Bom dia Chiappa, funcionou perfeitamente da forma que você passou, faltou apenas o end if; no final.
          Gostaria de tirar mais uma duvida, tem como exibir os dados do cursor na própria grid do pl/sql como acontece quando executo o select direto, fiz usando a função abaixo e mostra o resultado na aba Output.

          loop
          Dbms_Output.Put_Line(r.empresa ||’ ‘ || r.titulo);
          end loop;
          end if;
          end;

          #109377
          Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
          Moderador

            Bom, com “grid do pl/sql” imagino que vc está se referindo ao PL/SQL DEVELOPER, sim ?? Esse produto apesar do nome NÃO É DA ORACLE, não faz parte do database Oracle e como eu não o uso, não sei dizer especificamente : sugiro vc olhar no Fórum de usuários específico do fabricante desse produto, que é a Allround Automation, online em http://forums.allroundautomations.com/list.html (escolha o link do PL/SQL Developer, creio)…..
            Mas mesmo sem conhecer o produto profundamente, eu *** DUVIDO *** que isso seja possível : não confunda, quando vc escreve um comando SQL ** sem estar encapsulado ** num bloco BEGIN/END, vc está programando diretamente na linguagem SQL, e praticamente todas as tools clientes são perfeitamente capazes de exibir dados retornados por um comando SQL…

            ==> PORÉM, como eu disse, assim que adiciona blocos BEGIN/END vc passou para PL/SQL, e o FATO, completamente Documentado nos manuais Oracle, é que a linguagem PL/SQL é uma linguagem de BACK-END, fortemente ESPECIALIZADA em manipulação de dados lá DENTRO DO SERVIDOR – assim sendo, ela não tem UM comando sequer para acessar/executar o que for na máquina do usuário final que está rodando o PL/SQL (repito, PL/SQL roda DENTRO DO SERVIDOR ORACLE!!!), nem pra fazer interfaces de usuário (menus, aceitar INPUTs e/ou digitações de usuários), nem acessar impressoras e/ou devices quaisquer, nada nesse sentido… Já que o PL/SQL Não Tem essa capacidade, é DUVIDOSO que essa tal tool PL/SQL Developer implemente algo nesse sentido, tá bem ?? CONFIRA com o fabricante dela, mas eu acho Extremamente Difícil…

            Já que o PL/SQL não tem capacidade de exibir dados, o que fazer para mostrar na tela (pra fins de debug, digamos) os dados advindos de um SQL executado num bloco PL/SQL ? Há diversas opções :

            a. o RDBMS Oracle (independente tanto da linguagem SQL quanto da linguagem PL/SQL) mantém um buffer em memória que pode ser usado para guardar dados : vc manipula esse buffer via package DBMS_OUTPUT, sim… E como isso é uma característica geral e geérica do BANCo e não da linguagem, comumente TODAS as tools clientes (sqlplus, TOAD, PL/SQL Developer, Oracle SQL DEVELOPER, quase Todas mesmo) já são programadas para reconhecer e exibir o conteúdo desse buffer….
            Uma quase variação disso é guardar os dados num ARQUIVO DE TEXTO gravado lá no servidor Oracle, tipo um arquivo de log : FORA da linguagem PL/SQL (isso é uma funcionalidade DO RDBMS Oracle, não da linguagem PL/SQL em si!!) existe a package UTL_FILE, que serve pra isso – e INCLUSIVE, é possível vc fazer um simples SELECT de um arquivo-texto qualquer que exista no servidor Oracle, leia na doc Oracle sobre EXTERNAL TABLE…

            ou

            b. vc pode INSERIR os dados pesquisados/manipulados numa tabela Oracle (uma Global temporary Table, talvez) e depois fazer um SELECT simples (em SQL mesmo, sem blocos)

            ou

            c. vc pode usar um DEBUGGER de PL/SQL : sei que várias das tools clientes gráficas (TOAD, SQL DEVELOPER, SQL NAVIGATOR, PL/SQL DEVELOPER) possuem debuggers, e a maioria deles permite que vc interrompa a execução do seu programa PL/SQL e exiba variáveis, dados manipulados, etc

            ou

            d. vc pode programar o seu PL/SQL na forma de uma FUNCTION que retorne um RESULTSET, um conjunto (como se fosse um array em memória) de dados : isso se chama REF CURSOR no RDBMS Oracle… Isso feito, esse REF CURSOR pode ser exibido : no sqlplus por exemplo temos um utilíssimo comando PRINT, que já exibe Todo o REF CURSOR automaticamente, o item 1 do artigo https://sqlandplsql.com/2013/04/30/5-different-ways-to-test-oracle-ref-cursor-results/ exemplifica … Checa na sua tool PL/SQL DEVELOPER o que ela tem nesse sentido : nessse MESMO link que indiquei ela fala um pouco de como se faz isso no TOAD, não duvido que no PL/SQL developer que vc usa tenha algo nesse sentido….

            ou

            e. quase uma variação do item acima, podemos guardar os dados num array propriamente dito e fazer depois na tool cliente um simples SELECT dele : aí dados vindos de um simples SELECT (repito, sem blocos PL/SQL) qquer tool cliente sabe como exibir : http://www.justskins.com/forums/select-from-a-ref-212768.html tem um exemplo

            []s

            Chiappa

            OBS : eu te dei uma resposta Completa, mas na prática enquanto desenvolvedor eu gosto das coisas Simples, então prefiro DBMS_OUTPUT ou (onde possível, ie, se eu TENHO acesso ao servidor Oracle) UTL_FILE, talvez lendo o arquivo-texto via SELECT através duma External table….

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