Question

Could someone tell me if you can show line numbers in isql plus? I can't see the correspondence between its error reporting and the actual line count.

Many Thanks.

Was it helpful?

Solution

SQL*Plus has an interesting feature: Whenever you type a line of input, SQL*Plus adds a line number to the beginning of the next line. This line number is not part of the SQL command; it just allows you to refer to and edit specific lines in your SQL command. SQL*Plus acts like the standard text editor. SQL*Plus is on the TheTruePath.

This may make SQL*Plus error reporting less comprehensible when using SqlMode. Here is an example of the line number junk:

...
  2    3    4       from v$parameter p, all_tables u
          *
ERROR at line 2:
ORA-00942: table or view does not exist

This only happens if you enter multi-line SQL statements by using C-j instead of RET between lines (ie. using sql-accumulate-and-indent instead of comint-send-input). If you enter SQL statements one at a time, you’ll be fine.

The following elisp function must be added to comint-preoutput-filter-functions in order to strip the line numbers junk from the output:

(defun eat-sqlplus-junk (str)
  "Eat the line numbers SQL*Plus returns.
Put this on `comint-preoutput-filter-functions' if you are
running SQL*Plus.    If the line numbers are not eaten, you get stuff like this:
...
  2    3    4       from v$parameter p, all_tables u
          *
ERROR at line 2:
ORA-00942: table or view does not exist    The mismatch is very annoying."
  (interactive "s")
  (while (string-match " [ 1-9][0-9]  " str)
    (setq str (replace-match "" nil nil str)))
  str)

Test it by evaluating the following expression:

(string= "     from" (eat-sqlplus-junk "  2    3    4       from"))

Install it by adding the following expression to your .emacs; it will check wether the iSQL mode you have just started is indeed running SQL*Plus, and if it is, it will add

eat-sqlplus-junk to comint-preoutput-filter-functions.

(defun install-eat-sqlplus-junk () "Install comint-preoutput-filter-functions' if appropriate. Add this function tosql-interactive-mode-hook' in your .emacs: (add-hook 'sql-mode-hook 'install-eat-sqlplus-junk)" (if (string= (car (process-command (get-buffer-process sql-buffer))) sql-oracle-program) (add-to-list 'comint-preoutput-filter-functions 'eat-sqlplus-junk))) (add-hook 'sql-interactive-mode-hook 'install-eat-sqlplus-junk)

Source : Here

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top