金仓数据库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 / DECALARE d_SQL VARCHAR2(200); BEGIN d_SQL := 动态语句字符串; EXECUTE IMMEDIATE d_SQL [INTO 变量参数] [USING 参数类别]; EDN; / |
PLSQL动态SQL使用
本节将介绍一些常见的本地动态SQL使用方法。
- 动态SQL调用子程序
\set SQLTERM / CREATE PROCEDURE func (a INTEGER, b INTEGER) IS BEGIN RAISE NOTICE 'a * b= %', a*b; END; / DECLARE plsql_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=2 ANONYMOUS BLOCK |
当变量为集合、记录时,使用方式相同,即在USING字句中使用相应的变量。
- 动态SQL使用NULL表示未初始化的变量
\set SQLTERM / CREATE PROCEDURE func (a INTEGER, b INTEGER) IS BEGIN RAISE NOTICE 'a = %', a; RAISE NOTICE 'b = %', b; END; / DECLARE plsql_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 = 2 NOTICE: 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 ) IS BEGIN RAISE NOTICE ' %', a*b+c/d; END; / DECLARE plsql_block VARCHAR2(100); plsql_block2 VARCHAR2(100); a INTEGER; b INTEGER ; c INTEGER ; d INTEGER; BEGIN a := 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: 3 NOTICE: 3 NOTICE: 4 |
总结
本文主要介绍了PL/SQL中的本地动态SQL语句执行,并简单介绍了常用使用方法。通过使用动态SQL,可以在程序运行时动态的执行SQL操作,实现更加复杂的需求。




