Skip to content

静态SQL

静态SQL是指在编译应用程序时就已经确定并嵌入代码中的SQL语句。这类SQL语句在程序运行前就已经被预编译和优化,因此在执行时无需再进行解析和编译,直接由数据库执行。适用于简单的数据处理任务,如查询、插入、更新和删除等基本操作。

静态SQL和普通SQL具有相同的语法。但在查询语句中,静态SQL语句中支持SELECT INTO语法,而普通SQL中不支持该语法。

静态SQL有以下特点:

  • 静态SQL在应用程序编译阶段就已经被转换成数据库可识别的格式,执行效率高。
  • SQL语句固定,减少了SQL注入攻击的风险,静态SQL的SQL语句清晰可见,便于维护和调试。
  • 静态SQL在执行时通常比动态SQL更快,性能更好,但无法根据运行时条件动态生成SQL语句,限制了应用的灵活性。

示例

创建一个员工表,并插入数据,使用游标查询所有员工的信息并输出。

sql
CREATE TABLE employees (id NUMBER PRIMARY KEY, name VARCHAR2(100), position VARCHAR2(100), salary NUMBER);

INSERT INTO employees (id, name, position, salary) VALUES (1, 'xx', '软件工程师', 8000)(2, 'yy', '项目经理', 9000)(3, 'zz', '测试工程师', 7500);

DECLARE
  -- 定义游标
  CURSOR emp_cursor IS
    SELECT id, name, position, salary FROM employees;
  -- 定义变量来存储查询结果
  v_id employees.id%TYPE;
  v_name employees.name%TYPE;
  v_position employees.position%TYPE;
  v_salary employees.salary%TYPE;
BEGIN
  -- 打开游标
  OPEN emp_cursor;
  -- 循环读取数据
  LOOP
    FETCH emp_cursor INTO v_id, v_name, v_position, v_salary;
    EXIT WHEN emp_cursor%NOTFOUND;
    -- 输出结果
    DBMS_OUTPUT.PUT_LINE('ID: ' || v_id ||', Name: ' || v_name ||', Position: ' || v_position ||', Salary: ' || v_salary);
  END LOOP;
  -- 关闭游标
  CLOSE emp_cursor;
END;
/

-- 输出
ID: 1, Name: xx, Position: 软件工程师, Salary: 8000
ID: 2, Name: yy, Position: 项目经理, Salary: 9000
ID: 3, Name: zz, Position: 测试工程师, Salary: 7500

说明:

有关游标的详细信息请参见游标管理章节。