Oracle 动态SQL

在 Oracle 数据库中,动态 SQL 是一种强大的特性,它允许你在运行时动态地构造和执行 SQL 语句。相比于静态 SQL(在编译时就确定了 SQL 语句的内容),动态 SQL 提供了更高的灵活性,可根据不同的条件和输入生成不同的 SQL 语句。

语法EXECUTE IMMEDIATE dynamic_sql_string [INTO define_variable_list] [USING bind_argument_list];

适用场景

  • 动态表名或列名:当 SQL 语句中的表名或列名需要根据运行时的条件来确定时,静态 SQL 无法满足需求,此时可以使用动态 SQL
  • 动态条件:根据不同的用户输入或业务逻辑,动态生成 SQL 语句的查询条件
  • 动态数据操作:根据不同的情况执行不同的 INSERT、UPDATE 或 DELETE 操作

实例

-- 普通用法
DECLARE
    v_table_name VARCHAR2(30) := 'employees';
    v_employee_id NUMBER := 100;
    v_first_name VARCHAR2(50);
    v_sql VARCHAR2(200);
BEGIN
    -- 动态构造SQL语句
    v_sql := 'SELECT first_name FROM ' || v_table_name || ' WHERE id = :1';
    -- 执行动态SQL语句,并将结果存入变量
    EXECUTE IMMEDIATE v_sql INTO v_first_name USING v_employee_id;
    
    u_sql := 'UPDATE ' || v_table_name || ' SET first_name = :1 WHERE ID = :2';
    EXECUTE IMMEDIATE u_sql USING v_first_name, v_employee_id;
    COMMIT;
END;

-- 结合游标
DECLARE
    TYPE ref_cursor_type IS REF CURSOR;
    v_cursor ref_cursor_type;
    v_employee_id NUMBER;
    v_first_name VARCHAR2(50);
    v_sql VARCHAR2(200);
BEGIN
    -- 动态构造SQL语句
    v_sql := 'SELECT id, first_name FROM employees WHERE department_id = :1';

    OPEN v_cursor FOR v_sql USING 30;
    LOOP
        FETCH v_cursor INTO v_employee_id, v_first_name;
        EXIT WHEN v_cursor%NOTFOUND;
        
        u_sql := 'UPDATE employees SET first_name = :1 WHERE ID = :2';
        EXECUTE IMMEDIATE u_sql USING v_first_name, v_employee_id;
        COMMIT;
    END LOOP;
    -- 关闭游标变量
    CLOSE v_cursor;
END;

注意事项

  • SQL 注入风险:动态 SQL 可能会受到 SQL 注入攻击,因此在构造动态 SQL 语句时,必须对用户输入进行严格的验证和过滤,使用绑定变量可以有效防止 SQL 注入
  • 性能问题:动态 SQL 的执行需要在运行时进行解析和优化,因此性能可能会比静态 SQL 略低。在性能敏感的场景中,应谨慎使用动态 SQL
  • 错误处理:在执行动态 SQL 时,需要进行适当的错误处理,以捕获和处理可能出现的异常
posted @ 2025-04-25 21:33  伊文小哥  阅读(54)  评论(0)    收藏  举报