GaussDB提供两种方式:使用EXECUTE IMMEDIATE、OPEN FOR实现动态查询。前者通过动态执行SELECT语句,后者结合了游标的使用。当需要将查询的结果保存在一个数据集用于提取时,可使用OPEN FOR实现动态查询。
--传递并检索值(INTO子句用在USING子句前):
CREATE OR REPLACE FUNCTION dynamic_f()
RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
d_id INT := 2;
d_name VARCHAR(20);
d_salary INT;
BEGIN
EXECUTE IMMEDIATE 'SELECT name,salary FROM company1 WHERE id = :1' INTO d_name,d_salary USING IN d_id;
RETURN '姓名:' || d_name || ' , 薪水:¥' ||d_salary;
END $$;
--执行
CALL dynamic_f();
主要属性说明:
执行结果:
--使用OPEN FOR打开动态游标来执行
CREATE OR REPLACE FUNCTION dynamic_cur()
RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
v_name VARCHAR2(20);
v_salary INT;
TYPE ref_type IS REF CURSOR; --定义游标类型
my_cur ref_type; --定义游标变量
BEGIN
OPEN my_cur FOR 'SELECT name,salary FROM company1 WHERE id = :1' USING '3'; --打开游标, using是可选的
FETCH my_cur INTO v_name, v_salary; --获取数据
WHILE my_cur%FOUND
LOOP
RETURN v_name||'#'||v_salary;
FETCH my_cur INTO v_name, v_salary;
END LOOP;
CLOSE my_cur; --关闭游标
END $$;
--执行
CALL dynamic_cur();
主要属性说明
执行结果
--使用EXECUTE IMMEDIATE执行动态非查询语句
CREATE OR REPLACE FUNCTION dynamic_cur()
RETURNS void
LANGUAGE plpgsql
AS $$
DECLARE
v_id INT := 4;
v_name VARCHAR2(10) := 'ZhangSan';
v_age INT := 30;
v_address VARCHAR2(10) := 'BeiJing';
v_salary INT := 30000;
v_newname VARCHAR2(10) := 'company4';
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO company1 VALUES(:1, :2, :3, :4, :5)' USING v_id, v_name, v_age,v_address,v_salary;
EXECUTE IMMEDIATE 'ALTER TABLE company1 RENAME to ' || v_newname;
END $$;
--执行
CALL dynamic_cur();
--查看结果
SELECT * FROM company4;
执行结果
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!