2

SQL モードを使用して Oracle データベースに接続します。linesize と pagesize、および colsep のデフォルト設定は理想的ではないため、データベースへの接続時に Emacs が次のコマンドを自動的に実行するようにしたいと考えています。

SET COLSEP "|"
SET LINESIZE 9999
SET PAGESIZE 9999

どうすればこれを達成できますか?

4

3 に答える 3

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 に答える
3

sql-login-hookcomint関数を介してSQLを送信するための使用を正しく指摘したTobiasによる以前の回答から適応。

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 に答える