金仓数据库KingbaseES PLSQL动态SQL使用
关键字:KingbaseES、动态SQL、人大金仓、KingbaseES
PLSQL动态SQL介绍
在PL/SQL开发过程中,可以使用如标准的SQL语句或DML语句实现大部分的需求,但在某些特殊情况下,使用上述语句并不能实现需要的功能,例如在编译时参数未知的SQL、需要动态执行一个不确定的操作等。
PLSQL提供动态SQL来实现需要动态执行的SQL操作。动态SQL是指在PLSQL块编译时SQL语句是不确定的,如根据用户输入动态创建一个表。编译程序对动态语句部分不进行处理,只在程序运行时,动态的创建语句、对语句进行语法分析并执行。
在KingbaseES中动态SQL语句可以通过本地动态SQL或DBMS_SQL包来执行。本文主要介绍本地动态SQL执行,其语法为:
| \set SQLTERM /DECALAREd_SQL VARCHAR2(200);BEGINd_SQL := 动态语句字符串;EXECUTE IMMEDIATE d_SQL [INTO 变量参数] [USING 参数类别];EDN;/ |
|---|
PLSQL动态SQL使用
本节将介绍一些常见的本地动态SQL使用方法。
- 动态SQL调用子程序
| \set SQLTERM /CREATE PROCEDURE func (a INTEGER, b INTEGER)ISBEGINRAISE NOTICE 'a * b= %', a*b;END;/DECLAREplsql_block VARCHAR2(100);a INTEGER :=1;b INTEGER :=2;BEGIN/使用动态SQL语句调用子程序plsql_block := ‘BEGIN func(:x, :y) END’;/执行 func(a, b)EXECUTE IMMEDIATE plsql_block USING a, b;END;/ |
|---|
| --输出NOTICE: a * b=2ANONYMOUS BLOCK |
当变量为集合、记录时,使用方式相同,即在USING字句中使用相应的变量。
- 动态SQL使用NULL表示未初始化的变量
| \set SQLTERM /CREATE PROCEDURE func (a INTEGER, b INTEGER)ISBEGINRAISE NOTICE 'a = %', a;RAISE NOTICE 'b = %', b;END;/DECLAREplsql_block VARCHAR2(100);a INTEGER :=1;b INTEGER;BEGIN/使用动态SQL语句调用子程序plsql_block := ‘BEGIN func(:x, :y) END’;/执行 func(a, b)EXECUTE IMMEDIATE plsql_block USING a, b;END;/ |
|---|
| --输出NOTICE: a = 2NOTICE: b = NULL |
- 动态SQL中的重复占位符使用
| DROP TABLE IF EXISTS stu;CREATE TABLE stu(id INTEGER, age INTEGER, score INTEGER, num INTEGER);\set SQLTERM /CREATE PROCEDURE func (a INTEGER, b INTEGER, c INTEGER, d INTEGER )ISBEGINRAISE NOTICE ' %', a*b+c/d;END;/DECLAREplsql_block VARCHAR2(100);plsql_block2 VARCHAR2(100);a INTEGER;b INTEGER ;c INTEGER ;d INTEGER;BEGINa := 1;b := 2;/匿名块或CALL语句中的动态SQL语句使用重复占位符,USING中无需重复plsql_block := ‘BEGIN func(:x, :x, :y, :x) END’;/执行 func(a, a, b, a),重复占位符绑定USING字句的一个变量EXECUTE IMMEDIATE plsql_block USING a, b;c := 3;d := 3;/非匿名块或CALL语句中的动态PL/SQL使用重复占位符,以USING中的为准plsql_block2 := ‘INSET INTO stu VALUES(:x, :x, :y, :x) ’;/执行INSET INTO stu VALUES(a, b, c, c)EXECUTE IMMEDIATE plsql_block2 USING a, b, c, c;/执行INSET INTO stu VALUES(a, a, c, a)EXECUTE IMMEDIATE plsql_block2 USING a, a, c, a;END/ |
|---|
| --输出NOTICE: 3NOTICE: 3NOTICE: 4 |
总结
本文主要介绍了PL/SQL中的本地动态SQL语句执行,并简单介绍了常用使用方法。通过使用动态SQL,可以在程序运行时动态的执行SQL操作,实现更加复杂的需求。