人大金仓数据库KingbaseES PLSQL动态SQL使用

151 阅读3分钟

金仓数据库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使用方法。

  1. 动态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字句中使用相应的变量。

  1. 动态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
  1. 动态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操作,实现更加复杂的需求。

参考文档:

《KingbaseES PL/SQL 过程语言参考手册》