Избранные советы и трюки SQLPLUS

Сколько раз мне просто нужно быстрое соединение с Oracle DB, где SQLPLUS обрабатывает задание.

Я предполагаю, что когда люди начинают использовать Oracle, первое, что им говорят, это установить Toad или SQLDeveloper. Тем не менее, иногда вы не хотите ждать загрузки этих инструментов, если вы выполняете простые запросы.

У меня есть script, который я запускаю, когда я запускаю свою оболочку, чтобы получить лучший опыт:

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

Я обрезал свои настройки "COLUMN" для этого примера, но в основном, что помогает данным поместиться на экране.

Настройка формата даты действительно упрощает работу с датами.

Когда окно командной строки открывается в Windows, я устанавливаю свойства макета окна, чтобы я мог прокручивать, иметь более широкое окно и т.д. и сохранять настройки для будущих окон.

Использует ли каждый день SQLPLUS? Любые советы?

Ответ 1

Вы можете использовать rlwrap, чтобы добавить поддержку readline для sqlplus. Запустите sqlplus следующим образом:

$ rlwrap -c sqlplus [email protected]

Теперь вверх/вниз будет прокручиваться история команд. Используйте ctrl-r для поиска назад по истории и т.д. Это делает sqlplus терпимым.

Кроме того, добавьте это в свой login.sql, чтобы установить выравнивание по ширине вашего терминала:

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

Оба этих совета работают только с unix.

Ответ 2

Да, я использую SQL Plus каждый день, предпочитая Toad или SQL Developer (хотя я также использую SQL Developer для просмотра базы данных).

У меня есть следующее в моем login.sql script (который SQL Plus запускается автоматически):

1) Замените редактор по умолчанию (Блокнот) одним из моих вариантов:

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

2) Сделайте SQL-запрос показать имя базы данных, чтобы я знал, где я (спасибо Tom Kyte за это):

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

... плюс другие настройки, похожие на ваши.

Я также считаю, что Tom Kyte print_table процедура очень полезна.

Ответ 3

Помните, что мы можем поместить эти параметры в login.sql script, который будет запускаться автоматически при запуске SQL * Plus. Подробнее...

Оптимальная вещь в том, что с 10g этот script запускается каждый раз, когда мы подключаемся, а не только в первый раз, когда мы запускаем 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>

Ответ 4

Я использую SQL * Plus исключительно для работы с Oracle. Другие ответы уже дают очень удобное содержимое login.sql.

Это мой login.sql. Я скопировал некоторые предложения от Тома Ките и Уильяма Робертсона. Возможно, вы найдете некоторые вещи, которые хотите использовать.

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

Ответ 5

Мне нравится использовать sqlplus в автономном режиме.

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

где query.sql

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

Итак, я могу получить информацию из базы данных в файлах bat/ script в Windows или Unix.

Ответ 6

Я считаю целесообразным использовать переменные столбца SQL * Plus в директивах - например, я часто участвую в сеансе и хочу привязать к новому имени файла, чтобы избежать перезаписывания другого журнала, который может уже существовать и делать это ( первые три оператора через @file):

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

Затем я найду новый журнал, сортируя по времени - вы всегда можете использовать какую-либо стратегию, отличную от случайного, если хотите.