功能简介
EXECUTE IMMEDIATE 是 Oracle PL/SQL 中用于动态执行 SQL 语句或 PL/SQL 块的语法。它主要用于在运行时构造和执行 SQL 查询,这在静态 SQL 无法满足需求时非常有用。EXECUTE IMMEDIATE 与 LightDB的 EXECUTE 语句有一定相似性,但它们在具体使用和语法上有所不同。
为了兼容Oracle数据库,LightDB数据库从23.2版本开始支持EXECUTE IMMEDIATE语法,并且仅仅是一个语法糖。
用法
下面的代码中分别给出了在函数
、存储过程
和匿名块
中的使用样例:
-- create table
CREATE TABLE test_employees (
employee_id SERIAL PRIMARY KEY,
first_name VARCHAR(50)
);
INSERT INTO test_employees (first_name) VALUES ('John'), ('Jane'), ('Alice'), ('Bob'), ('David');
-- create function
CREATE OR REPLACE FUNCTION get_employee_name_func(p_employee_id INTEGER)
RETURNS VARCHAR AS $$
DECLARE
sql_query TEXT;
emp_name VARCHAR;
BEGIN
sql_query := 'SELECT first_name FROM test_employees WHERE employee_id = $1';
EXECUTE IMMEDIATE sql_query INTO emp_name USING p_employee_id;
RAISE NOTICE 'Employee name is: %', emp_name;
RETURN emp_name;
END;
$$ LANGUAGE plpgsql;
-- create procedure
CREATE OR REPLACE PROCEDURE get_employee_name_proce(p_employee_id INTEGER, OUT emp_name VARCHAR)
AS $$
DECLARE
sql_query TEXT;
BEGIN
sql_query := 'SELECT first_name FROM test_employees WHERE employee_id = $1';
EXECUTE sql_query INTO emp_name USING p_employee_id IMMEDIATE;
RAISE NOTICE 'Employee name is: %', emp_name;
END;
$$ LANGUAGE plpgsql;
-- exec function and procedure
DO $$
DECLARE
emp_name VARCHAR;
BEGIN
CALL get_employee_name_proce(2, emp_name);
PERFORM get_employee_name_func(3);
END $$;
-- anonymous block
DO $$
DECLARE
emp_name VARCHAR;
sql_query TEXT;
p_employee_id INTEGER := 5;
BEGIN
sql_query := 'SELECT first_name FROM test_employees WHERE employee_id = $1';
EXECUTE sql_query IMMEDIATE INTO emp_name USING p_employee_id;
RAISE NOTICE 'Employee name is: %', emp_name;
END $$;