2014-11-05 53 views
2

我使用Sql模式連接到Oracle數據庫。爲LINESIZE和頁面大小,和COLSEP的默認設置是不理想的,所以我想有Emacs的在連接到我的數據庫自動運行以下命令:如何定義啓動sql-mode時運行的命令?

SET COLSEP "|" 
SET LINESIZE 9999 
SET PAGESIZE 9999 

我怎樣才能做到這一點?

+0

要運行上述命令,始終可以將它們包含在login.sql文件中。 http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch2.htm#i1133106。但是,這將運行SQL * Plus從內部運行或不運行Emacs的命令。 – 2014-11-05 18:58:06

回答

3

改編自Tobias之前的回答,它正確指出使用sql-login-hook通過comint函數發送SQL。

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

看起來你有可能測試它。因此,我刪除我的答案,並給你的答案upvote,以便它首先出現在列表中。我也將「托比亞斯的答案」改爲「托比亞斯的前答案」。希望你對此好。 – Tobias 2014-11-06 12:44:04

+0

沒問題,托比亞斯。我再次編輯了一些方面的細節,但你的改變也很好。 – phils 2014-11-06 20:30:38

+1

我不確定你是否注意到了這一點,但爲了解決這個問題,我必須在每個字符串的末尾添加「\ n」。 – Babu 2014-12-10 22:04:02

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來左右滾動。