一、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及以上版本。