Адаптировано из более раннего ответа Тобиаса, в котором правильно указано использование 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#i1133106. Однако это приведет к выполнению команд, запускаемых SQL * Plus из Emacs или без него. –