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

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

SET COLSEP "|"
SET LINESIZE 9999
SET PAGESIZE 9999

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

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_\\)*=[#>] ")))

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

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

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

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

Другие вопросы по тегам