如何使用替换变量设置 LINESIZE 和 PAGESIZE?

How do I set LINESIZE and PAGESIZE with a substitution variable?

我正在尝试在 SQL*Plus 中使用 PL/SQL 脚本,以根据开发人员输入的报告是否应横向或纵向打印来设置行大小和页面大小。如果是横向,我要 linesize 132 和 pagesize 60。如果是纵向,我分别要 88 和 80。

我正在尝试使用替换变量来这样做:

DEFINE PRINT_ORIENTATION 'PORTRAIT'

COLUMN LINESIZE_VALUE NOPRINT new_value LINE
COLUMN PAGESIZE_VALUE NOPRINT new_value PAGE

SELECT DECODE('&PRINT_ORIENTATION', 'PORTRAIT', 88, 'LANDSCAPE', 132) AS LINE,
       DECODE('&PRINT_ORIENTATION', 'PORTRAIT', 80, 'LANDSCAPE', 60) AS PAGE
FROM DUAL
/

SET LINESIZE &LINE
SET PAGESIZE &PAGE

然而,系统只是提示我手动输入行和页的值。我需要做什么才能在 SET 命令中使用替换变量?

the column .. new_value ... syntax:

COLUMN Q_LINE NEW_VALUE LINE
COLUMN Q_PAGE NEW_VALUE PAGE

SELECT DECODE('&PRINT_ORIENTATION', 'PORTRAIT', 88, 'LANDSCAPE', 132) AS Q_LINE,
       DECODE('&PRINT_ORIENTATION', 'PORTRAIT', 80, 'LANDSCAPE', 60) AS Q_PAGE
FROM DUAL
/

SET LINESIZE &LINE
SET PAGESIZE &PAGE

这允许您根据查询结果定义替换值。

使用 "shell" 替换变量: 我们在这里处理类似问题的方法是在临时 sql 中生成正确的大小调整设置文件。

不确定它是否有帮助,但这里有一个关于如何根据终端大小设置列数的提示,在 @$HOME/sqlmlogin.sql:

def_editor=emacs
set null °
set arraysize 1
set pagesize 0
set serveroutput on
host > $HOME/sqltmp_size.sql ; tty -s && ( eval $( resize ) ; echo "set lines $COLUMNS\n set pages 0" >> $HOME/sql/tmp_size.sql )
-- then call the temp script
@$HOME/sqltmp_size.sql
-- remove afterwards
host rm -f $HOME/sqltmp_size.sql

然后这样调用 sqlplus

sqlplus / @$HOME/sqlmlogin.sql

因此您还可以从这样的脚本中为您的用户生成您想要的静态值。