SQL*Plus 的 COLUMN ... NEW_VALUE 子參數可將查詢結果直接存入替換變數,讓腳本具備程式語言般的變數操作能力,減少資料庫存取、提升執行效率。
COLUMN column_name NEW_VALUE variable_name [NOPRINT] SELECT value_expr column_name FROM ...;
COLUMN log_mode NEW_VALUE log_mode NOPRINT SELECT value log_mode FROM v$parameter WHERE name = 'log_archive_start'; SELECT 'The current archivelog mode is '||'&&log_mode' FROM dual;
COLUMN today NEW_VALUE today SELECT TO_CHAR(SYSDATE,'MM/DD/YYYY HH24:MI') today FROM dual;
COLUMN db_block_size NEW_VALUE blksz NOPRINT
SELECT value db_block_size FROM v$parameter WHERE name = 'db_block_size';
SET PAGES 999 LINES 80
SPOOL tab_rpt.lst
SELECT table_name c1,
b.extents c2,
b.freelists c3,
num_rows c4,
(num_rows * avg_row_len) * 100 / (blocks * &blksz) AS pct_used
FROM ...;
此處 &blksz 會被替換為查詢得到的 db_block_size 值,避免重複查詢。
NOPRINT 隱藏中間查詢輸出NEW_VALUE 在 SELECT 執行**後**生效,同一陳述式不可立即引用善用 NEW_VALUE,能讓 SQL*Plus 腳本從「一次性查詢」進化為「可重用、參數化的自動化工具」。