web-dev-qa-db-fra.com

Trucs et astuces SQLPLUS préférés

Tant de fois, j'ai juste besoin d'une connexion rapide à une base de données Oracle, où SQLPLUS gère le travail.

J'imagine que lorsque les gens commencent à utiliser Oracle, la première chose qu'on leur dit de faire est d'installer Toad ou SQLDeveloper. Même ainsi, parfois, vous ne voulez pas attendre que ces outils se chargent, si vous effectuez des requêtes simples.

J'ai un script que j'exécute lorsque je démarre mon Shell, donc j'obtiens une meilleure expérience:

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';

J'ai coupé mes paramètres "COLONNE" pour cet exemple, mais en gros, cela aide les données à s'afficher à l'écran.

La définition du format de date simplifie vraiment le traitement des dates.

Lorsque la fenêtre de commande s'ouvre dans Windows, je définis les propriétés de disposition de la fenêtre pour pouvoir faire défiler, avoir une fenêtre plus large, etc. et enregistrer les paramètres pour les futures fenêtres.

Quelqu'un d'autre utilise-t-il SQLPLUS quotidiennement? Des conseils?

60
ericp

Vous pouvez utiliser rlwrap pour ajouter le support readline à sqlplus. Exécutez sqlplus comme ceci:

$ rlwrap -c sqlplus username@database

Maintenant, haut/bas fera défiler l'historique des commandes. Utilisez ctrl-r pour rechercher en arrière dans l'historique, etc. Cela rend sqlplus supportable.

Ajoutez également ceci à votre login.sql pour définir la taille de la ligne quelle que soit la largeur de votre terminal:

Host echo "set linesize" $(stty -a|head -n1|cut -f7 -d' '|cut -f1 -d';') > .tmp.sql
@.tmp.sql
Host rm -f .tmp.sql

Ces deux conseils ne fonctionnent que sous Unix.

55
Dana

Oui, j'utilise SQL Plus tous les jours de préférence à Toad ou SQL Developer (bien que j'utilise également SQL Developer pour parcourir la base de données).

J'ai les éléments suivants dans mon script login.sql (que SQL Plus exécute automatiquement):

1) Remplacez l'éditeur par défaut (Bloc-notes) par celui de mon choix:

define _editor = "C:\Program Files\TextPad 5\TextPad.exe"

2) Faire apparaître le nom de la base de données SQL Prompt pour que je sache où je suis (merci à Tom Kyte pour cela):

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

... ainsi que d'autres paramètres similaires au vôtre.

Je trouve également la procédure print_table de Tom Kyte très utile.

17
Tony Andrews

N'oubliez pas que nous pouvons placer ces paramètres dans le script login.sql qui sera exécuté automatiquement à chaque démarrage de SQL * Plus. En savoir plus.

La chose intéressante à ce sujet est que, depuis 10g, ce script est exécuté à chaque fois que nous nous connectons plutôt la première fois que nous lançons 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>
10
APC

J'utilise SQL * Plus exclusivement pour travailler avec Oracle. D'autres réponses donnent déjà un contenu login.sql très pratique.

C'est mon login.sql. J'ai copié quelques suggestions de Tom Kyte et William Robertson là-dedans. Peut-être que vous trouvez également des choses que vous souhaitez utiliser.

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
8
Rob van Wijk

J'aime utiliser sqlplus hors ligne.

sqlplus -S user/password @query.sql> file.txt

où query.sql est

set feedback off verify off heading off pagesize 0
...here goes a query...
quit;
/

Je peux donc obtenir des informations de la base de données dans mes fichiers bat/script sous Windows ou Unix.

4
Jonathan

Je trouve qu'il est pratique d'utiliser des variables de colonne SQL * Plus dans les directives - par exemple, je suis souvent dans une session et je veux spouler vers un nouveau nom de fichier pour éviter d'écraser un autre journal qui peut déjà exister et faire cela (trois premières déclarations via un @fichier):

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

Je trouverai ensuite le nouveau journal en le triant par heure - vous pouvez toujours utiliser une stratégie autre que le nombre aléatoire si vous préférez.

3
dpbradley