Как определить команды для запуска при запуске sql-режима?

Я использую Sql-режим для подключения к базе данных Oracle. Настройки по умолчанию для размера строки и размера страницы, а также colsep не идеальны, поэтому я хотел бы, чтобы Emacs автоматически выполнял следующие команды при подключении к моим базам данных:

SET COLSEP "|"
SET LINESIZE 9999
SET PAGESIZE 9999

Как я могу это сделать?


person Babu    schedule 05.11.2014    source источник
comment
Чтобы всегда запускать вышеуказанные команды, их можно включить в файл login.sql. docs.oracle.com/cd/B19306_01/server. 102/b14357/ch2.htm#i1133106. Однако при этом команды будут выполняться вне зависимости от того, запущен ли SQL*Plus из Emacs или без него.   -  person Shannon Severance    schedule 05.11.2014


Ответы (3)


Адаптировано из более раннего ответа Тобиаса, в котором правильно указано использование sql-login-hook для отправки SQL через функции comint.

В Postgres мне нужно было отправлять каждую команду отдельно, поэтому здесь я использовал для этого comint-send-string (и Майкл, сопровождающий sql.el, указал, что это действительно предпочтительный метод).

Обратите также внимание на то, что один и тот же sql-login-hook используется со всеми продуктами баз данных, поэтому рекомендуется проверить sql-product перед отправкой команд для конкретного продукта. Я включил проверку для Oracle в этом случае.

(add-hook 'sql-login-hook 'my-sql-login-hook)

(defun my-sql-login-hook ()
  "Custom SQL log-in behaviours. See `sql-login-hook'."
  (when (eq sql-product 'oracle)
    (let ((proc (get-buffer-process (current-buffer))))
      (comint-send-string proc "SET COLSEP \"|\";\n")
      (comint-send-string proc "SET LINESIZE 9999;\n")
      (comint-send-string proc "SET PAGESIZE 9999;\n"))))

Обратите внимание, что вы должны включить новую строку в конце команды, чтобы воспроизвести ввод RET при интерактивной отправке команды. (Если вы этого не сделаете, команда(ы) по-прежнему будут «введены», но не вступят в силу, пока вы вручную не наберете RET в командной строке).

Если это все еще не работает, обратите внимание, что sql-login-hook запускается только sql-product-interactive, если он распознает интерактивную подсказку SQL в буфере. Это приглашение сопоставляется с использованием регулярного выражения sql-prompt-regexp (которое устанавливается с использованием значений по умолчанию для каждого продукта в sql-product-alist). Если шаблон по умолчанию не соответствует вашим подсказкам, вы можете изменить его в sql-interactive-mode-hook.

Например, следующее позволяет запросам Postgres включать в имя базы данных символы, составляющие символы (такие как символ подчеркивания _), а также символы, составляющие слово:

(add-hook 'sql-interactive-mode-hook 'my-sql-interactive-mode-hook)

(defun my-sql-interactive-mode-hook ()
  "Custom interactive SQL mode behaviours. See `sql-interactive-mode-hook'."
  (when (eq sql-product 'postgres)
    ;; Allow symbol chars in database names in the prompt.
    ;; Default postgres pattern was: "^\\w*=[#>] " (see `sql-product-alist').
    (setq sql-prompt-regexp "^\\(?:\\sw\\|\\s_\\)*=[#>] ")))
person phils    schedule 05.11.2014
comment
Похоже, у вас была возможность проверить это. Поэтому я удаляю свой ответ и поддерживаю ваш ответ, чтобы он появился первым в списке. Я также меняю ответ Тобиаса на прежний ответ Тобиаса. Надеюсь, ты в порядке с этим. - person Tobias; 06.11.2014
comment
Нет проблем, Тобиас. Я снова отредактировал, чтобы немного уточнить некоторые аспекты, но ваше изменение также было в порядке. - person phils; 06.11.2014
comment
Я не уверен, заметили ли вы это, но чтобы это решение сработало для меня, я должен добавить \n в конец каждой строки. - person Babu; 11.12.2014
comment
Спасибо Бабу. Теперь я включил эту информацию в ответ. - person phils; 18.03.2015

Чтобы всегда запускать команды, их можно включить в файл login.sql. http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch2.htm#i1133106. Однако при этом команды будут выполняться вне зависимости от того, запущен ли SQL*Plus из Emacs или без него.

person Shannon Severance    schedule 05.11.2014

Ваш LOGIN.SQL повлияет на многие сеансы Oracle, в том числе за пределами Emacs.

"sql-login-hook" был добавлен специально для настройки инструмента команд SQL в Emacs. Как указал «филс», использование comint-send-string' является предпочтительным способом отправки команд. Если вы ищете ответ и вам нужно проанализировать ответ, используйте "sql-redirect-value".

Я устанавливаю LINESIZE 32767 PAGESIZE 50000 (их максимальные значения) и использую C-preor и C-next для прокрутки вправо и влево.

person Michael    schedule 06.11.2014