2026年Debian上SQLPlus语法完全指南:从基础到高级(2026)

一、SQLPlus基础语法

1.1 启动与连接语法

# 本地连接
sqlplus username/password
sqlplus / as sysdba
sqlplus / as sysoper

# 远程连接
sqlplus username/password@//host:port/service_name
sqlplus username/password@tnsalias

# 静默模式(脚本用)
sqlplus -S username/password@db

1.2 退出语法

-- 方法一:EXIT
EXIT;

-- 方法二:QUIT
QUIT;

-- 带退出码
EXIT SQL.SQLCODE;
EXIT SUCCESS;
EXIT FAILURE;

二、SQL语句语法

2.1 SELECT语句

-- 基本查询
SELECT column1, column2 FROM table_name;

-- 带条件
SELECT * FROM employees WHERE department_id = 10;

-- 排序
SELECT * FROM employees ORDER BY salary DESC;

-- 分组
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id;

-- 分页(Oracle 12c+)
SELECT * FROM employees OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

2.2 DML语句

-- INSERT
INSERT INTO employees (id, name, salary) VALUES (1, '张三', 5000);

-- UPDATE
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;

-- DELETE
DELETE FROM employees WHERE id = 1;

-- MERGE
MERGE INTO target t
USING source s ON (t.id = s.id)
WHEN MATCHED THEN UPDATE SET t.salary = s.salary
WHEN NOT MATCHED THEN INSERT VALUES (s.id, s.name, s.salary);

2.3 DDL语句

-- CREATE TABLE
CREATE TABLE employees (
    id NUMBER(6),
    name VARCHAR2(50),
    salary NUMBER(8,2),
    hire_date DATE
);

-- ALTER TABLE
ALTER TABLE employees ADD (email VARCHAR2(100));
ALTER TABLE employees MODIFY (name VARCHAR2(100));
ALTER TABLE employees DROP COLUMN email;

-- DROP TABLE
DROP TABLE employees;
DROP TABLE employees PURGE;  -- 不进回收站

-- CREATE INDEX
CREATE INDEX idx_emp_salary ON employees(salary);
CREATE INDEX idx_emp_comp ON employees(last_name, first_name);

三、SQLPlus命令语法

3.1 格式化命令

-- 设置行宽
SET LINESIZE 200;

-- 设置页面大小
SET PAGESIZE 50;

-- 列格式化
COLUMN salary FORMAT $99,999.99 HEADING '薪资'
COLUMN hire_date FORMAT A10 HEADING '入职日期'

-- 清除格式
CLEAR COLUMNS;

3.2 执行控制命令

-- 执行脚本
@/path/to/script.sql
@@nested_script.sql  -- 执行嵌套脚本

-- Spool输出
SPOOL /tmp/output.txt
SELECT * FROM employees;
SPOOL OFF;

-- 执行操作系统命令
HOST ls -la
!ls -la  -- 快捷方式

3.3 变量与替换

-- 定义变量
DEFINE dept_id = 10
DEFINE dept_name = 'SALES'

-- 使用变量
SELECT * FROM employees WHERE department_id = &dept_id;

-- 带提示的变量
ACCEPT dept_id NUMBER PROMPT '请输入部门ID: '
SELECT * FROM employees WHERE department_id = &dept_id;

-- 绑定变量
VARIABLE b_salary NUMBER
EXEC :b_salary := 5000;
SELECT * FROM employees WHERE salary > :b_salary;

四、PL/SQL语法

4.1 匿名块

DECLARE
    v_name VARCHAR2(50);
    v_salary NUMBER(8,2);
BEGIN
    SELECT first_name, salary
    INTO v_name, v_salary
    FROM employees
    WHERE employee_id = 100;

    DBMS_OUTPUT.PUT_LINE('姓名: ' || v_name || ', 薪资: ' || v_salary);
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('未找到员工');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('错误: ' || SQLERRM);
END;
/

4.2 存储过程

CREATE OR REPLACE PROCEDURE raise_salary(
    p_emp_id IN NUMBER,
    p_percent IN NUMBER
) AS
BEGIN
    UPDATE employees
    SET salary = salary * (1 + p_percent/100)
    WHERE employee_id = p_emp_id;

    COMMIT;
END raise_salary;
/

-- 调用
EXEC raise_salary(100, 10);

4.3 函数

CREATE OR REPLACE FUNCTION get_annual_salary(
    p_emp_id IN NUMBER
) RETURN NUMBER AS
    v_salary NUMBER;
BEGIN
    SELECT salary * 12
    INTO v_salary
    FROM employees
    WHERE employee_id = p_emp_id;

    RETURN v_salary;
END get_annual_salary;
/

-- 调用
SELECT get_annual_salary(100) FROM dual;

4.4 触发器

CREATE OR REPLACE TRIGGER trg_emp_audit
BEFORE INSERT OR UPDATE OR DELETE ON employees
FOR EACH ROW
BEGIN
    IF INSERTING THEN
        INSERT INTO audit_log VALUES (SYSDATE, 'INSERT', :NEW.employee_id);
    ELSIF UPDATING THEN
        INSERT INTO audit_log VALUES (SYSDATE, 'UPDATE', :NEW.employee_id);
    ELSIF DELETING THEN
        INSERT INTO audit_log VALUES (SYSDATE, 'DELETE', :OLD.employee_id);
    END IF;
END;
/

五、脚本编程语法

5.1 条件判断

-- IF-THEN-ELSE
DECLARE
    v_salary NUMBER;
BEGIN
    SELECT salary INTO v_salary FROM employees WHERE id = 1;

    IF v_salary < 5000 THEN
        DBMS_OUTPUT.PUT_LINE('低薪');
    ELSIF v_salary BETWEEN 5000 AND 10000 THEN
        DBMS_OUTPUT.PUT_LINE('中等');
    ELSE
        DBMS_OUTPUT.PUT_LINE('高薪');
    END IF;
END;
/

5.2 循环

-- LOOP循环
DECLARE
    v_counter NUMBER := 1;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE('计数器: ' || v_counter);
        v_counter := v_counter + 1;
        EXIT WHEN v_counter > 10;
    END LOOP;
END;
/

-- WHILE循环
DECLARE
    v_counter NUMBER := 1;
BEGIN
    WHILE v_counter <= 10 LOOP
        DBMS_OUTPUT.PUT_LINE('计数器: ' || v_counter);
        v_counter := v_counter + 1;
    END LOOP;
END;
/

-- FOR循环
BEGIN
    FOR i IN 1..10 LOOP
        DBMS_OUTPUT.PUT_LINE('i = ' || i);
    END LOOP;
END;
/

5.3 游标

DECLARE
    CURSOR c_emp IS SELECT id, name, salary FROM employees;
    v_id employees.id%TYPE;
    v_name employees.name%TYPE;
    v_salary employees.salary%TYPE;
BEGIN
    OPEN c_emp;
    LOOP
        FETCH c_emp INTO v_id, v_name, v_salary;
        EXIT WHEN c_emp%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(v_id || ' ' || v_name || ' ' || v_salary);
    END LOOP;
    CLOSE c_emp;
END;
/

-- 游标FOR循环(简化)
BEGIN
    FOR r IN (SELECT id, name, salary FROM employees) LOOP
        DBMS_OUTPUT.PUT_LINE(r.id || ' ' || r.name);
    END LOOP;
END;
/

六、SQLPlus环境配置语法

6.1 login.sql配置

-- $ORACLE_HOME/sqlplus/admin/glogin.sql 或 ~/.login.sql

-- 格式化设置
SET PAGESIZE 50
SET LINESIZE 200
SET FEEDBACK ON
SET TIMING ON
SET SQLPROMPT '_USER@_CONNECT_IDENTIFIER> '

-- 日期格式
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

-- 数字格式
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';

6.2 命令行参数

# 常用参数
sqlplus -S          # 静默模式
sqlplus -H          # 显示帮助
sqlplus -V          # 显示版本
sqlplus -L          # 只尝试登录一次
sqlplus -M          # 使用NLS设置
sqlplus -R n        # 受限模式

七、错误处理语法

7.1 SQL错误

-- WHENEVER自动处理
WHENEVER SQLERROR EXIT SQL.SQLCODE
WHENEVER SQLERROR CONTINUE

-- 示例
WHENEVER SQLERROR EXIT FAILURE
@script1.sql
@script2.sql
EXIT SUCCESS

7.2 操作系统错误

WHENEVER OSERROR EXIT FAILURE
CREATE TABLE test (id NUMBER);
EXIT SUCCESS

7.3 PL/SQL异常处理

BEGIN
    -- 代码
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('无数据');
    WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE('返回多行');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('错误: ' || SQLCODE || ' - ' || SQLERRM);
END;
/

八、Debian特有配置

8.1 环境变量

# ~/.bashrc
export ORACLE_HOME=/usr/lib/oracle/21/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export SQLPATH=$HOME/sqlplus_scripts

8.2 中文字符处理

-- 设置中文环境
ALTER SESSION SET NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8';

-- 或设置环境变量
export NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8

九、常见问题解答

Q1: SQLPlus中如何执行多行SQL?

A: 输入完一行后按回车继续,以分号;或斜杠/结束并执行。

Q2: 如何取消正在执行的SQL?

A: 按Ctrl+C中断。若无效,另开会话执行ALTER SYSTEM KILL SESSION 'sid,serial#';

Q3: 如何调试PL/SQL代码?

A: 使用DBMS_OUTPUT.PUT_LINE输出调试信息,或启用SERVEROUTPUT ON

SET SERVEROUTPUT ON SIZE 1000000
BEGIN
    DBMS_OUTPUT.PUT_LINE('调试信息');
END;
/

十、总结

SQLPlus语法涵盖:
1. 基础连接语法:本地/远程连接
2. SQL语句语法:SELECT/DML/DDL
3. SQLPlus命令:格式化/执行控制/变量
4. PL/SQL语法:匿名块/存储过程/函数/触发器
5. 脚本编程:条件/循环/游标
6. 环境配置:login.sql/命令行参数
7. 错误处理:WHENEVER/异常处理

掌握这些语法,可以在Debian上高效使用SQLPlus进行Oracle数据库管理和开发。

注:本文基于Oracle 21c + Debian 12环境整理,适用于Oracle 11g及以上版本。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注