- Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 6 anos, 3 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
22 de agosto de 2018 às 5:50 pm #109372fabio de queirozParticipante
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 thenselect * 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:22 de agosto de 2018 às 10:50 pm #109373José Laurindo ChiappaModeradorNã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
23 de agosto de 2018 às 4:05 pm #109375fabio de queirozParticipanteBom 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;23 de agosto de 2018 às 5:44 pm #109377José Laurindo ChiappaModeradorBom, 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….
-
AutorPosts
- Você deve fazer login para responder a este tópico.