generating - Trucos y consejos favoritos de SQLPLUS
set markup html on spool on (6)
Muchas veces solo necesito una conexión rápida a Oracle DB, donde SQLPLUS maneja el trabajo.
Me imagino que cuando las personas comiencen a usar Oracle, lo primero que se les dice que hagan es instalar Toad o SQLDeveloper. Aun así, a veces no quiere esperar a que se carguen esas herramientas, si está realizando algunas consultas simples.
Tengo un script que ejecuto cuando inicio mi shell para que tenga una mejor experiencia:
SET pagesize 2000
SET LONG 10000
SET linesize 1000
COLUMN last_name format a20
COLUMN total format 999,999,999
SET feedback ON
alter session set nls_date_format = ''yyyy-mm-dd hh:mi:ssPM'';
Recorté mi configuración de "COLUMNA" para este ejemplo, pero básicamente, eso ayuda a que los datos se ajusten a la pantalla.
Establecer el formato de fecha realmente simplifica el manejo de las fechas.
Cuando se abre la ventana de comandos en Windows, establezco las propiedades de diseño de la ventana para poder desplazarme, tener una ventana más amplia, etc. y guardar la configuración para ventanas futuras.
¿Alguien más usa SQLPLUS diariamente? ¿Algun consejo?
Encuentro que es útil usar variables de columna SQL * Plus dentro de las directivas; por ejemplo, a menudo estoy en una sesión y quiero poner en cola un nuevo nombre de archivo para evitar sobrescribir otro registro que ya existe y hacer esto (primeras tres declaraciones) a través de un archivo @):
SQL> column spr new_value spoolref
SQL> select user||''_''||abs(dbms_random.random) spr from dual;
SQL> spool &spoolref
... do work here ...
SQL> spool off
Luego encontraré el nuevo registro ordenando por tiempo; siempre puede usar alguna estrategia que no sea el número aleatorio, si lo prefiere.
Me gusta usar sqlplus en off-line.
sqlplus -S user/password @query.sql> file.txt
donde query.sql es
set feedback off verify off heading off pagesize 0
...here goes a query...
quit;
/
Así que puedo obtener información de la base de datos en mis archivos bat / script en Windows o Unix.
Puede usar rlwrap para agregar soporte de lectura a sqlplus. Ejecute sqlplus de esta manera:
$ rlwrap -c sqlplus username@database
Ahora, arriba / abajo se desplazará por el historial de comandos. Use ctrl-r para buscar hacia atrás a través del historial, etc. Esto hace que sqlplus sea soportable.
Además, agréguelo a su login.sql para configurar el lineal a cualquier ancho que tenga su terminal:
HOST echo "set linesize" $(stty -a|head -n1|cut -f7 -d'' ''|cut -f1 -d'';'') > .tmp.sql
@.tmp.sql
HOST rm -f .tmp.sql
Ambos consejos solo funcionan en Unix.
Recuerde que podemos poner estas configuraciones en el script login.sql que se ejecutará automáticamente cada vez que iniciemos SQL * Plus. Saber más.
Lo bueno de esto es que, desde 10g, este script se ejecuta cada vez que nos conectamos en lugar de la primera vez que iniciamos SQL * Plus ...
SQL> conn apc
Enter password:
Connected.
Running login script
Session altered.
SQL> conn scott
Enter password:
Connected.
Running login script
Session altered.
SQL>
Sí, uso SQL Plus todos los días antes que Toad o SQL Developer (aunque también uso SQL Developer para navegar en la base de datos).
Tengo lo siguiente en mi script login.sql (que SQL Plus se ejecuta automáticamente):
1) Reemplace el editor predeterminado (Bloc de notas) con uno de mi elección:
define _editor = "C:/Program Files/TextPad 5/TextPad.exe"
2) Hacer que el mensaje SQL muestre el nombre de la base de datos para que sepa dónde estoy (gracias a Tom Kyte por esto):
COLUMN global_name new_value gname
SET TERMOUT OFF
SELECT LOWER(USER) || ''@'' || global_name||CHR(10)||''SQL> '' AS global_name
FROM global_name;
SET SQLPROMPT ''&gname''
SET TERMOUT ON
... además de otra configuración similar a la tuya.
También me parece muy útil el procedimiento print_table Tom Kyte.
Uso SQL * Plus exclusivamente para trabajar con Oracle. Otras respuestas ya dan algunos contenidos muy útiles de login.sql.
Este es mi login.sql
. Copié algunas sugerencias de Tom Kyte y William Robertson allí. Quizás encuentres algunas cosas que quieras usar también.
set termout off
set serveroutput on size unlimited
set pagesize 50000
set linesize 135
set long 50000
set trimspool on
set tab off
def _editor = "C:/Progra~1/Notepad++/Notepad++.exe"
define gname=idle
column global_name new_value gname
select lower(user) || ''@'' ||
substr(global_name,1,decode(dot,0,length(global_name),dot-1)) global_name
from (select global_name,instr(global_name,''.'') dot from global_name);
set sqlprompt ''&gname> ''
alter session set nls_date_format = ''dd-mm-yyyy hh24:mi:ss''
/
var sid number
var serial# number
var tracefile VARCHAR2(200)
DECLARE
v_audsid v$session.audsid%TYPE;
BEGIN
SELECT sid, serial#, audsid
INTO :sid, :serial#, v_audsid
FROM v$session
WHERE audsid = SYS_CONTEXT(''USERENV'',''SESSIONID'');
SELECT par.value ||
CASE WHEN par.value LIKE ''%/%'' THEN ''/'' ELSE ''/' END ||
LOWER(th.instance) ||
''_ora_'' || LTRIM(TO_CHAR(pro.spid,''fm99999'')) || ''.trc'' AS filename
INTO :tracefile
FROM v$process pro
, v$session se
, v$parameter par
, v$thread th
WHERE se.audsid = v_audsid
AND pro.addr = se.paddr
AND par.NAME = ''user_dump_dest'';
END;
/
BEGIN
IF :sid IS NULL THEN
SELECT sid
INTO :sid
FROM v$mystat
WHERE rownum = 1;
END IF;
END;
/
set termout on
set feedback off
exec DBMS_OUTPUT.PUT_LINE(''Sessie: '' || :sid || CASE WHEN :serial# IS NULL THEN '' (no access to V$ tables)'' ELSE '','' || :serial# END)
exec IF :tracefile IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE(''Eventueel trace-bestand: '' || :tracefile); END IF
prompt
set feedback on