文档中心MogDBMogDB StackUqbar
v1.1

文档:v1.1

动态语句

执行动态查询语句

介绍执行动态查询语句。MogDB提供两种方式: 使用EXECUTE IMMEDIATE、OPEN FOR实现动态查询。前者通过动态执行SELECT语句,后者结合了游标的使用。当需要将查询的结果保存在一个数据集用于提取时,可使用OPEN FOR实现动态查询。

EXECUTE IMMEDIATE

语法图请参见图1

图 1 EXECUTE IMMEDIATE dynamic_select_clause::=

EXECUTE-IMMEDIATE-dynamic_select_clause

using_clause子句的语法图参见图2

图 2 using_clause::=

using_clause

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

  • define_variable: 用于指定存放单行查询结果的变量。

  • USING IN bind_argument: 用于指定存放传递给动态SQL值的变量,即在dynamic_select_string中存在占位符时使用。

  • USING OUT bind_argument: 用于指定存放动态SQL返回值的变量。

    img 须知:

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

OPEN FOR

动态查询语句还可以使用OPEN FOR打开动态游标来执行。

语法参见图3

图 3 open_for::=

open_for

参数说明:

  • cursor_name: 要打开的游标名。
  • dynamic_string: 动态查询语句。
  • USING value: 在dynamic_string中存在占位符时使用。

游标的使用请参考游标

执行动态非查询语句

语法

语法请参见图4

图 4 noselect::=

noselect

using_clause子句的语法参见图5

图 5 using_clause::=

using_clause-0

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

USING IN bind_argument用于指定存放传递给动态SQL值的变量,在dynamic_noselect_string中存在占位符时使用,即动态SQL语句执行时,bind_argument将替换相对应的占位符。要注意的是,bind_argument只能是值、变量或表达式,不能是表名、列名、数据类型等数据库对象。如果存储过程需要通过声明参数传递数据库对象来构造动态SQL语句(常见于执行DDL语句时),建议采用连接运算符"||"拼接dynamic_select_clause。另外,动态语句允许出现重复的占位符,相同占位符只能与唯一一个bind_argument按位置一一对应。

示例

--创建表
mogdb=# CREATE TABLE sections_t1
(
   section       NUMBER(4) ,
   section_name  VARCHAR2(30),
   manager_id    NUMBER(6),
   place_id      NUMBER(4)
);

--声明变量
mogdb=# DECLARE
   section       NUMBER(4) := 280;
   section_name  VARCHAR2(30) := 'Info support';
   manager_id    NUMBER(6) := 103;
   place_id      NUMBER(4) := 1400;
   new_colname   VARCHAR2(10) := 'sec_name';
BEGIN
--执行查询
    EXECUTE IMMEDIATE 'insert into sections_t1 values(:1, :2, :3, :4)'
       USING section, section_name, manager_id,place_id;
--执行查询(重复占位符)
    EXECUTE IMMEDIATE 'insert into sections_t1 values(:1, :2, :3, :1)'
       USING section, section_name, manager_id;
--执行ALTER语句(建议采用"||"拼接数据库对象构造DDL语句)
    EXECUTE IMMEDIATE 'alter table sections_t1 rename section_name to ' || new_colname;
END;
/

--查询数据
mogdb=# SELECT * FROM sections_t1;

--删除表
mogdb=# DROP TABLE sections_t1;

动态调用存储过程

动态调用存储过程必须使用匿名的语句块将存储过程或语句块包在里面,使用EXECUTE IMMEDIATE…USING语句后面带IN、OUT来输入、输出参数。

语法

语法请参见图6

图 6 call_procedure::=

call_procedure

using_clause子句的语法参见图7

图 7 using_clause::=

using_clause-1

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

  • CALL procedure_name: 调用存储过程。
  • USING [IN|OUT|IN OUT] bind_argument: 用于指定存放传递给存储过程参数值的变量。bind_argument前的修饰符与对应参数的修饰符一致。

动态调用匿名块

动态调用匿名块是指在动态语句中执行匿名块,使用EXECUTE IMMEDIATE…USING语句后面带IN、OUT来输入、输出参数。

语法

语法请参见图8

图 8 call_anonymous_block::=

call_anonymous_block

using_clause子句的语法参见图9

图 9 using_clause::=

using_clause-2

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

  • 匿名块程序实施部分,以BEGIN语句开始,以END语句停顿,以一个分号结束。
  • USING [IN|OUT|IN OUT] bind_argument,用于指定存放传递给存储过程参数值的变量。bind_argument前的修饰符与对应参数的修饰符一致。
  • 匿名块中间的输入输出参数使用占位符来指明,要求占位符个数与参数个数相同,并且占位符所对应参数的顺序和USING中参数的顺序一致。
  • 目前MogDB在动态语句调用匿名块时,EXCEPTION语句中暂不支持使用占位符进行输入输出参数的传递。
Copyright © 2011-2024 www.enmotech.com All rights reserved.