我使用 Sql 模式连接到 Oracle 数据库。linesize 和 pagesize 以及 colsep 的默认设置并不理想,所以我想让 Emacs 在连接到我的数据库时自动运行以下命令:
SET COLSEP "|"
SET LINESIZE 9999
SET PAGESIZE 9999
我怎样才能做到这一点?
我使用 Sql 模式连接到 Oracle 数据库。linesize 和 pagesize 以及 colsep 的默认设置并不理想,所以我想让 Emacs 在连接到我的数据库时自动运行以下命令:
SET COLSEP "|"
SET LINESIZE 9999
SET PAGESIZE 9999
我怎样才能做到这一点?
改编自 Tobias 较早的答案,该答案正确地指出了使用sql-login-hook
comint 函数发送 SQL。
使用 Postgres,我需要分别发送每个命令,所以在这里我曾经comint-send-string
这样做过(sql.el 维护者 Michael 表示这确实是首选方法)。
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 提示时sql-login-hook
才会运行。sql-product-interactive
此提示使用正则表达式匹配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 内部还是外部运行,这都会运行命令。
您LOGIN.SQL
将影响许多 Oracle 会话,包括 Emacs 之外的会话。
"sql-login-hook"
专门为在 Emacs 中配置 SQL 命令工具而添加。正如“phils”所指出的,使用comint-send-string'
是发送命令的首选方式。如果您正在寻找响应并需要解析响应,请使用"sql-redirect-value"
.
我设置LINESIZE 32767 PAGESIZE 50000
(它们的最大值)并使用 C-prior 和 C-next 左右滚动。