云数据库 GaussDB-执行动态查询语句:EXECUTE IMMEDIATE

时间:2023-11-01 16:22:24

EXECUTE IMMEDIATE

语法图请参见图1

图1 EXECUTE IMMEDIATE dynamic_select_clause::=

using_clause子句的语法图参见图2

图2 using_clause::=

对以上语法格式的解释如下:

  • define_variable,用于指定存放单行查询结果的变量。
  • USING IN bind_argument,用于指定存放传递给动态SQL值的变量,即在dynamic_select_string中存在占位符时使用。
  • USING OUT bind_argument,用于指定存放动态SQL返回值的变量。
    • 查询语句中,into和out不能同时存在;
    • 占位符命名以“:”开始,后面可跟数字、字符或字符串,与USING子句的bind_argument一一对应;
    • bind_argument只能是值、变量或表达式,不能是表名、列名、数据类型等数据库对象,即不支持使用bind_argument为动态SQL语句传递模式对象。如果存储过程需要通过声明参数传递数据库对象来构造动态SQL语句(常见于执行DDL语句时),建议采用连接运算符“||”拼接dynamic_select_clause;
    • 动态PL/SQL块允许出现重复的占位符,即相同占位符只能与USING子句的一个bind_argument按位置对应。

示例

 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829
--从动态语句检索值(INTO 子句):postgres=# DECLARE   staff_count  VARCHAR2(20);BEGIN   EXECUTE IMMEDIATE 'select count(*) from hr.staffs'      INTO staff_count;   dbe_output.print_line(staff_count);END;/--传递并检索值(INTO子句用在USING子句前):postgres=# CREATE OR REPLACE PROCEDURE dynamic_procAS   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;   dbe_output.print_line(first_name || ' ' || salary);END;/--调用存储过程postgres=# CALL dynamic_proc();--删除存储过程postgres=# DROP PROCEDURE dynamic_proc;
support.huaweicloud.com/devg-opengauss/opengauss_devg_0679.html