2

我使用 Sql 模式连接到 Oracle 数据库。linesize 和 pagesize 以及 colsep 的默认设置并不理想,所以我想让 Emacs 在连接到我的数据库时自动运行以下命令:

SET COLSEP "|"
SET LINESIZE 9999
SET PAGESIZE 9999

我怎样才能做到这一点?

4

3 回答 3

3

改编自 Tobias 较早的答案,该答案正确地指出了使用sql-login-hookcomint 函数发送 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_\\)*=[#>] ")))
于 2014-11-05T20:57:53.640 回答
3

要运行这些命令,始终可以将它们包含在 login.sql 文件中。http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch2.htm#i1133106。然而,无论 SQL*Plus 是在 Emacs 内部还是外部运行,这都会运行命令。

于 2014-11-05T18:58:39.460 回答
1

LOGIN.SQL将影响许多 Oracle 会话,包括 Emacs 之外的会话。

"sql-login-hook"专门为在 Emacs 中配置 SQL 命令工具而添加。正如“phils”所指出的,使用comint-send-string'是发送命令的首选方式。如果您正在寻找响应并需要解析响应,请使用"sql-redirect-value".

我设置LINESIZE 32767 PAGESIZE 50000(它们的最大值)并使用 C-prior 和 C-next 左右滚动。

于 2014-11-06T00:11:11.733 回答