Oracle 动态SQL
在 Oracle 数据库中,动态 SQL 是一种强大的特性,它允许你在运行时动态地构造和执行 SQL 语句。相比于静态 SQL(在编译时就确定了 SQL 语句的内容),动态 SQL 提供了更高的灵活性,可根据不同的条件和输入生成不同的 SQL 语句。
语法EXECUTE IMMEDIATE dynamic_sql_string [INTO define_variable_list] [USING bind_argument_list];
适用场景
实例
-- 普通用法
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;