首页 > 数据库 > > 动态语句-执行动态查询语句
介绍执行动态查询语句。GaussDB 200提供两种方式:使用EXECUTE IMMEDIATE、OPEN FOR实现动态查询。前者通过动态执行SELECT语句,后者结合了游标的使用。当需要将查询的结果保存在一个数据集用于提取时,可使用OPEN FOR实现动态查询。
语法图请参见图1。
using_clause子句的语法图参见图2。
对以上语法格式的解释如下:

示例
--从动态语句检索值(INTO 子句):
DECLARE
staff_count VARCHAR2(20);
BEGIN
EXECUTE IMMEDIATE 'select count(*) from hr.staffs'
INTO staff_count;
dbms_output.put_line(staff_count);
END;
/
--传递并检索值(INTO子句用在USING子句前):
CREATE OR REPLACE PROCEDURE dynamic_proc
AS
staff_id NUMBER(6) := 200;
first_name VARCHAR2(20);
salary NUMBER(8,2);
BEGIN
EXECUTE IMMEDIATE 'select first_name, salary from hr.staffs where staff_id = :1'
INTO first_name, salary
USING IN staff_id;
dbms_output.put_line(first_name || ' ' || salary);
END;
/
--调用存储过程
CALL dynamic_proc();
--删除存储过程
DROP PROCEDURE dynamic_proc;
动态查询语句还可以使用OPEN FOR打开动态游标来执行。
语法参见图3。
参数说明:
游标的使用请参考游标。
示例
DECLARE
name VARCHAR2(20);
phone_number VARCHAR2(20);
salary NUMBER(8,2);
sqlstr VARCHAR2(1024);
TYPE app_ref_cur_type IS REF CURSOR; --定义游标类型
my_cur app_ref_cur_type; --定义游标变量
BEGIN
sqlstr := 'select first_name,phone_number,salary from hr.staffs
where section_id = :1';
OPEN my_cur FOR sqlstr USING '30'; --打开游标, using是可选的
FETCH my_cur INTO name, phone_number, salary; --获取数据
WHILE my_cur%FOUND LOOP
dbms_output.put_line(name||'#'||phone_number||'#'||salary);
FETCH my_cur INTO name, phone_number, salary;
END LOOP;
CLOSE my_cur; --关闭游标
END;
/
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3165120/ ,如需转载,请注明出处,否则将追究法律责任。