Вы находитесь на странице: 1из 21

SQLPLUS, a tool versátil

O sqlplus é uma das mais antigas ferramentas


presentes no pacote do banco de dados Oracle,
mas ainda assim é uma das mais
incompreendidas e sub-utilizadas – nesta
Apresentação objetivamos demonstrar alguns
dos recursos presentes na tool que podem
ajudar em muito o DBA Oracle, e até certo
ponto o desenvolvedor Oracle também.
Quando NÃO usar sqlplus .....

 Veremos que a tool tem muitas utilidades, mas


o que ela é em essência é um apresentador de
linhas de texto, não há o conceito de grid de
dados, não há como se realinhas linhas, uma
vez exibida a linha não pode ser tocada/editada,
se for desejado um sort de resultados a consulta
deve ser refeita – isso invalida a tool para
diversas atividades de usuários finais e
Analistas, tais como :
 Edição online local de dados
 Visualização de grande volume de dados

 Manipulação local (ie, sorting, Ocultação/Re-

exibição Parcial) sem refresh da Consulta


 Mudança da àrea de exibição dos dados, com

Zoom, Reajuste de janelas, etc


 Auxiliares Gráficos para a Análise – por exemplo,

recursos de destacar/pintar áreas de dados


 Para estas tarefas o sqlplus é reconhecidamente
incapaz, deve-se usar umas das muitas
alternativas, freeware (como Oracle SQL
Developer e muitas outras) ou pagas (como
TOAD e demais).
SQLPLUS para programação ??

 O SQLPLUS deveria ser incluído no mix de tools de


desenvolvimento e Programação não-cliente (ie, SQL e
PL/SQL) por causa das features que serão discutidas
mais à frente, E por causa das vantagens inerentes
que serão vistas, mas certamente ele não possui
alguns recursos por vezes considerados desejáveis por
alguns, como auto-complemento, color syntax, reuso
de linhas anteriores num texto – assim, embora útil,
ele não se qualifica como tool única de
desenvolvimento em diversos casos.
Vantagens do SQLPLUS
 É nativo do banco Oracle, enormes são as chances de
existir num dado ambiente, Inclusive pode existir tanto
no cliente quanto no servidor, possibilitando
testes/desenvolvimento/execuções/etc em ambos
 Por não ter uma GUI, usa pouquíssimos recursos de
rede, excelente para acesso via telnet / ssh e
protocolos restritos
 Interface simples e limpa, curva de aprendizado muitas
vezes menor
 Não exige runtime, interpreter ou assemelhado
 É a tool usada nos exemplos, cursos, manuais, etc, da
Oracle
 Usa a API de conexão Oracle e o client Oracle, o que o
torna excelente para simulação de processos, criação
de casos-teste, etc, sem termos middleware de
terceiros a debugar/instalar, ou config de tool
 Ao contrário de muitas GUIs, por default não faz
paginação,não está otimizada para recuperar as
primeiras linhas mais rápido - excelente para se testar
o tempo completo de um SQL
 Por ser nativa, tem um grau de reconhecimento /
utilização de features Oracle (como Binding, array
processing, ref cursor variables, etc) muito maior que
a maioria das tools não-Oracle Reconhece
 Tem EXATAMENTE o mesmo comportamento básico
em qualquer SO aonde o banco Oracle rode, não exige
retreinamento/adaptação.
Recursos SQLPLUS

 Além das vantagens citadas, o SQLPLUS


possui uma série de recursos únicos (ou
compartilhados com poucas outras tools),
normalmente pouco usados/conhecidos, que
o habilitam a diversos usos, esta é a origem
da flexibilidade citada no título desta
Apresentação. Nos slides seguintes
discutiremos alguns deles.
SQLPLUS como Automatizador de Tarefas
 Não se discute a facilidade que uma GUI proporciona à
uma execução de tarefa via click de mouse, mas e se a
tarefa tiver que ser executada centenas de vezes
(digamos, para centenas de objetos dum banco) ? É
humanamente inviável se clicar centenas de vezes, e
embora não seja impossível é EXTREMAMENTE
dificultado em muitas situações se automatizar clicks
de mouse... Natural então se pensar em se obter um
script, um arquivo-texto com a (longa) lista de
comandos, mas é inviável se escrever uma - entra em
cena o melhor amigo do utilizador Oracle, a técnica de
se gerar um script automaticamente – no sqlplus a
opção mais prática é o comando SPOOL. Exemplo
simples :
No exemplo, suponha que o objetivo é coletarmos estatísticas do schema SCOTT, primeiro
teríamos um .SQL que gera a lista de comandos :
-- script gera_coleta_stats.sql
set term off feedback off verify off pages 0 lines 500 trimspool on
head off
spool C:\coleta_stats.sql
select 'execute sys.dbms_stats.gather_table_stats(ownname=>'
|| chr(39) || owner || chr(39) || ',tabname=>'
|| chr(39) || table_name || chr(39)
|| ',granularity=>' || chr(39) || 'ALL' || chr(39)
|| ',method_opt=>' || chr(39) || 'FOR ALL INDEXED COLUMNS
SIZE AUTO' || chr(39)
|| ', estimate_percent=>NULL,cascade=>TRUE, DEGREE=>6);'
from dba_tables
where owner in ('SCOTT')
order by table_name
/
select 'exit' || chr(10) from dual
/
spool off
exit

E teríamos um shell script (.BAT no Windows) que executa o gerador e imediatamente após
executa o script completo gerado :

-- coleta_stats.bat
sqlplus user/pwd @gera_coleta_stats.sql
sqlplus user/pwd @C:\coleta_stats.sql
Observações A Respeito :

 Evidentemente, conforme o caso poderíamos ter que


setar variáveis de ambiente nos scripts, usar uma
lógica um pouco mais complexa, mas ainda deve ser
compensadora a técnica
 Poderíamos usar um loop PL/SQL com EXECUTE
IMMEDIATE para a automação, mas a técnica de gerar
script tem a vantagem de produzir um arquivo-texto,
que pode ser editado e serve de log
 Outras tools além do sqlplus (como TOAD e Oracle
SQL Developer) possum capacidade de gerar arquivo-
texto sem programação e poderiam talvez ser usadas,
mas perdemos as vantagens do sqlplus neste caso
SQLPLUS como ferramenta de tunning

 SET TIMING ON/OFF : mostra o tempo de execução dos SQLs


executados. Além do uso óbvio,é útil para medida de rede,
executando o mesmo SQL no servidor (sem tráfego de rede) E no
cliente
 SET AUTOTRACE ON/OFF/TRACEONLY : além da óbvia utilidade do
trace para tunning, a opção TRACEONLY desliga o output de dados
e o screen painting, útil para se focar no tempo de resposta do SQL
em si, não em rede ou manipulação de dados
 Bind variables : ao contrário de várias outras tools de
tunning, o sqlplus permite que se criem variáveis a
serem usadas no SQL, simulando melhor o que
acontece numa aplicação real que usa binding
 Scripting : usando as técnicas de automação citadas
anteriormente, facilmente podemos simular várias
sessões executando o mesmo SQL, ou simular uma
sobrecarga no banco, permitindo testes mais realistas

OBS : outros recursos de tunning do sqlplus, como


EXPLAIN PLAN, já são universalizados, muitas outras
tools os possuem também, às vezes até melhorados em
algum ponto, então não os cito, mas existem, numa
situação em que as características do sqlplus sejam
melhor indicadas, podem ser usados.
sqlplus como ferramenta de debug
Para debug lógico (ie, breakpoints, visualização de valores de
variáveis, etc) o sqlplus não é instrumentado, mas há algumas
situações de debugging aonde a sua característica de tool nativa,
que usa APIs Oracle nativas, e de interatividade podem ser muito
úteis, tal como :
 Problemas de middleware : a técnica principal para se
identificar se um bug pode estar sendo causado por
middlewares, gerenciadores externos de transação, etc, é
executar os SQLs duvidosos no sqlplus
 Localização de erros de sintaxe num SQL : o sqlplus tem a
excelente característica de inserir um “*” logo abaixo de onde
foi detectado o erro de sintaxe
 Stack de erros de banco : muitas vezes um dado erro foi
causado por um erro anterior (principalmente em caso de
PL/SQL), diversas tools mostram apenas o erro mais recente,
não todo o stack
sqlplus como gerador de relatórios

O SQLPLUS iniciou a existência como um gerador de relatórios:


depois da introdução do Oracle Reports, essa característica passou
a não ser tão divulgada, mas ainda existe e pode ser explorada.
Vale a pena citar que, além das vantagens já citadas inerentes ao
sqlplus, as características de reporting do sqlplus são controladas
via comandos escritos, não exigindo grande treinamento e
permitindo usarmos as técnicas de automação via script já
discutidas. São as principais :
 BREAK  permite quebras no report, exemplo :
SCOTT@o10gr2:sql>BREAK ON DEPTNO SKIP 1 ON MGR
SCOTT@o10gr2:sql>SELECT DEPTNO, MGR, JOB, EMPNO, ENAME, SAL FROM
EMP ORDER BY 1,2,3;

DEPTNO MGR JOB EMPNO ENAME SAL


---------- ---------- --------- ---------- ---------- ----------
10 7782 CLERK 7934 MILLER 1300
7839 MANAGER 7782 CLARK 2450
PRESIDENT 7839 KING 5000

20 7566 ANALYST 7788 SCOTT 3000


ANALYST 7902 FORD 3000
7788 CLERK 7876 ADAMS 1100
7839 MANAGER 7566 JONES 2975
7902 CLERK 7369 SMITH 800

30 7698 CLERK 7900 JAMES 950


SALESMAN 7521 WARD 1250
SALESMAN 7499 ALLEN 1600
SALESMAN 7844 TURNER 1500
SALESMAN 7654 MARTIN 1250
7839 MANAGER 7698 BLAKE 2850

14 linhas selecionadas.
 B/T/TITLE  introduz headers (Top) ou trailers
(Bottom) no report

 COLUMN nomedacoluna opções  permite


especificar máscaras de formatação e títulos em
colunas

 COMPUTE  permite efetuar cálculos / totais num


relatório

Um exemplo de utilização ....


SCOTT@o10gr2:SQL>COLUMN SAL HEADING "Salário" FORMAT 99G999D09
SCOTT@o10gr2:SQL>COLUMN ENAME HEADING "Nome do | Funcionário"
SCOTT@o10gr2:SQL>TTITLE "Relatório de Empregados" LEFT
SCOTT@o10gr2:SQL>BTITLE "Final do Relatório" CENTER
SCOTT@o10gr2:SQL>COMPUTE SUM LABEL "Total:" OF SAL ON DEPTNO
SCOTT@o10gr2:SQL>COMPUTE SUM LABEL "Total Geral:" OF SAL ON REPORT

Relatório de Empregados
Nome do
DEPTNO MGR JOB EMPNO Funcionário Salário
---------- ---------- --------- -------- ----------- ----------
10 7782 CLERK 7934 MILLER 1.300,00
7839 MANAGER 7782 CLARK 2.450,00
PRESIDENT 7839 KING 5.000,00
********** ********** ----------
Total: 8.750,00

20 7566 ANALYST 7788 SCOTT 3.000,00


ANALYST 7902 FORD 3.000,00
7788 CLERK 7876 ADAMS 1.100,00
7839 MANAGER 7566 JONES 2.975,00
7902 CLERK 7369 SMITH 800,00
********** ********** ----------
Total: 10.875,00

...... etc ..............

Final do Relatório
sqlplus como unloader/gerador de dumps de
dados em arquivos-texto
Uma utilização típica do sqlplus é a geração de dados em
formato texto num arquivo : nada mais é do que
utilizarmos num script todas as técnicas de reporting
anteriores, mas desviando o output com um comando
SPOOL n:\path\nomedoarquivo – caso necessário, pode-
se desligar a saída em tela e cabeçalhos de colunas com
os comandos SET TERM OFF FEEDBACK OFF VERIFY
OFF HEAD OFF , remover espaços em branco no fim da
linha com TRIMSPOOL ON , e usar os comandos de
formatação SQLPLUS que forem necessários.
SQLPLUS como gerador de Páginas WEB
Na versão 8i do SQLPLUS foi introduzido o
comando MARKUP, que serve para inserir
formatações HTML no resultado de saída
dum SQL qualquer nele executado –
adicionando-se a capacidade também
natova de SPOOL, com isto é possível se
criar um arquivo HTML com os dados
resultando dum SQL qualquer. Copiando-
se tal arquivo para o path de um servidor
web, temos uma página web com dados.
Um exemplo com formatação html – no caso
vamos ter um script .SQL com os
comandos :
-- script htmlrun.sql
set termout off verify off

set markup HTML ON HEAD " -


<style type='text/css'> -
body {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} -
p { font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} -
table,tr,td {font:10pt Arial,Helvetica,sans-serif; color:Black; background:#f7f7e7; -
padding:0px 0px 0px 0px; margin:0px 0px 0px 0px; white-space:nowrap;} -
th { font:bold 10pt Arial,Helvetica,sans-serif; color:#336699; background:#cccc99; -
padding:0px 0px 0px 0px;} -
h1 { font:16pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; -
border-bottom:1px solid #cccc99; margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px
0px;} -
h2 { font:bold 10pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White;
-
margin-top:4pt; margin-bottom:0pt;} a {font:9pt Arial,Helvetica,sans-serif;
color:#663300; -
background:#ffffff; margin-top:0pt; margin-bottom:0pt; vertical-align:top;} -
</style> -
<title>&1</title>" -
BODY "" -
TABLE "border='1' align='center' summary='Script output'" -
SPOOL ON ENTMAP ON PREFORMAT OFF

spool C:\output_&_connect_identifier..html

prompt &1

clear buffer
1 &1
/

spool off
set markup html off spool off
host start C:\output_&_connect_identifier..html
set termout on
SCOTT@10g:SQL>@htmlrun "select * from emp"

select * from emp

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7369 SMITH CLERK 7902 17/12/1980 00:00:00 800   20
7499 ALLEN SALESMAN 7698 20/02/1981 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 22/02/1981 00:00:00 1250 500 30
7566 JONES MANAGER 7839 02/04/1981 00:00:00 2975   20
7654 MARTIN SALESMAN 7698 28/09/1981 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/1981 00:00:00 2850   30
7782 CLARK MANAGER 7839 09/06/1981 00:00:00 2450   10
7788 SCOTT ANALYST 7566 19/04/0087 00:00:00 3000   20
7839 KING PRESIDENT   17/11/1981 00:00:00 5000   10
7844 TURNER SALESMAN 7698 08/09/1981 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 23/05/0087 00:00:00 1100   20
7900 JAMES CLERK 7698 03/12/1981 00:00:00 950   30
7902 FORD ANALYST 7566 03/12/1981 00:00:00 3000   20
7934 MILLER CLERK 7782 23/01/1982 00:00:00 1300   10
14 linhas selecionadas.

Вам также может понравиться