LightDB PL/pgsql支持execute immediate语法

功能简介

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 $$;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值