rlwrap工具可为SQLPlus添加历史命令上下切换(↑/↓箭头)、反向搜索(Ctrl+R)等功能,解决原生SQLPlus命令行编辑不便的问题。
rlwrap-0.42.tar.gz),解压后执行./configure && make && make install;~/.bash_profile,添加alias sqlplus='rlwrap sqlplus'(及其他常用命令别名,如rman、lsnrctl),执行source ~/.bash_profile使配置生效。通过修改SQLPlus全局配置文件(glogin.sql,位于$ORACLE_HOME/sqlplus/admin/),可统一设置输出格式,避免每次手动调整。
SET LINESIZE 1000; -- 设置每行显示字符数(避免内容换行)
SET PAGESIZE 50; -- 设置每页显示行数(减少分页次数)
SET TRIMSPOOL ON; -- 去除输出文件中的尾部空格
SET COLSEP ' '; -- 设置列分隔符(默认为竖线,空格更清晰)
SET HEADING ON; -- 显示列标题
SET FEEDBACK OFF; -- 关闭查询结果的行数反馈(减少冗余信息)
这些配置会在每次启动SQLPlus时自动加载。sqlplus username/password@servicename格式连接(如sqlplus scott/tiger@orcl);若需以SYSDBA权限连接,添加AS SYSDBA(如sqlplus sys/password@orcl AS SYSDBA)。DESCRIBE table_name(或DESC table_name):快速查看表结构;SHOW USER:显示当前登录用户;SPOOL file_name:将后续输出保存到指定文件(如SPOOL output.txt);SPOOL OFF:停止保存并关闭文件;@script.sql:执行SQL脚本文件(如@query.sql)。VARIABLE emp_id NUMBER;
BEGIN
:emp_id := 100; -- 绑定变量赋值
END;
/
SELECT * FROM employees WHERE employee_id = :emp_id; -- 使用绑定变量
DEFINE命令定义变量,实现脚本参数化(如DEFINE dept_name='销售部'),在脚本中用&dept_name引用(如SELECT * FROM employees WHERE department_name = '&dept_name')。#!/bin/bash
sqlplus / as sysdba <<EOF
SHUTDOWN IMMEDIATE;
STARTUP;
EXIT;
EOF
结合crontab定时执行(如每天凌晨2点备份):crontab -e
# 添加:0 2 * * * /path/to/backup_script.sh
SPOOL命令将查询结果输出到文件(如SPOOL employees.txt),执行完查询后用SPOOL OFF停止保存。COLUMN命令调整列宽、标题等,例如:COLUMN employee_id FORMAT 99999; -- 设置员工ID列宽度为5位
COLUMN salary FORMAT $99,999.99; -- 设置薪资列格式为带美元符号的数值
COLUMN department_name HEADING '部门名称'; -- 修改列标题
SELECT employee_id, salary, department_name FROM employees;
DECLARE-BEGIN-END结构编写复杂逻辑(如批量插入、事务控制),例如:DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM employees WHERE department_id = 10;
DBMS_OUTPUT.PUT_LINE('部门10的员工数:' || v_count);
END;
/
SET SERVEROUTPUT ON(设置输出大小,如SET SERVEROUTPUT ON SIZE 1000000),用于显示PL/SQL块的输出信息。EXCEPTION部分捕获错误,例如:DECLARE
v_emp_name employees.last_name%TYPE;
BEGIN
SELECT last_name INTO v_emp_name FROM employees WHERE employee_id = 9999; -- 不存在的ID
DBMS_OUTPUT.PUT_LINE('员工姓名:' || v_emp_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('未找到该员工!');
END;
/
SPOOL命令保存执行过程(如SPOOL debug.log),便于后续分析错误。ORA-01403: no data found:查询未返回数据,检查WHERE条件是否正确;ORA-01422: exact fetch returns more than requested number of rows:SELECT INTO语句返回多行,需用游标处理;ORA-00942: table or view does not exist:表或视图不存在,检查表名拼写或用户权限。