匿名块结构
- DECLARE 段可选;BEGIN...END 必须存在
- 每条语句以分号结束,END 后面也要分号
- PL/SQL 里的 SELECT 必须用 INTO 接收结果,且只能返回一行
- SET SERVEROUTPUT ON 不执行的话,DBMS_OUTPUT 的内容看不到
SET SERVEROUTPUT ON
DECLARE
v_name VARCHAR2(50);
v_count NUMBER := 0; -- 声明时可直接初始化
c_pi CONSTANT NUMBER := 3.14159; -- 常量必须初始化
BEGIN
SELECT COUNT(*) INTO v_count FROM employees;
DBMS_OUTPUT.PUT_LINE('员工总数: ' || v_count);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('出错: ' || SQLERRM);
END;
/结尾的 / 是执行匿名块的必需符号,不是 SQL 的一部分。
锚定类型:%TYPE 与 %ROWTYPE
硬编码类型(写成 VARCHAR2(25))在表结构变更后会失效。用 %TYPE 让变量自动跟随列类型,用 %ROWTYPE 直接跟随整行结构,这是 PL/SQL 的惯用做法。
DECLARE
v_last_name employees.last_name%TYPE; -- 跟随列类型
v_emp employees%ROWTYPE; -- 跟随整行
BEGIN
SELECT last_name INTO v_last_name
FROM employees WHERE employee_id = 100;
SELECT * INTO v_emp
FROM employees WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE(v_last_name || ' / ' || v_emp.salary);
END;
/只作示例阅读:5 行写入限制下不执行任意 PL/SQL、循环写入或动态 SQL;只开放字面量 DBMS_OUTPUT 打印。请在独立学习数据库中练习。
替换变量 vs 绑定变量
- 替换变量是客户端文本替换,等于每次都是一条新 SQL(硬解析)
- 绑定变量让相同结构的 SQL 复用游标,减少硬解析,是性能关键
- 应用开发中一律用绑定变量,绝不用字符串拼接把值塞进 SQL(还能防注入)
-- 替换变量 &x:SQL*Plus 层做文本替换,编译期生效
-- 执行时 SQL*Plus 会提示你现场输入 emp_id 的值,
-- 属于交互式用法,不能放进脚本批量跑
SELECT * FROM employees WHERE employee_id = &emp_id;
-- 绑定变量 :x:值在运行期传入,SQL 可以复用解析结果
VARIABLE b_emp_id NUMBER
EXEC :b_emp_id := 100
SELECT last_name FROM employees WHERE employee_id = :b_emp_id;
PRINT b_emp_id