暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

数据猿 2023-11-17
730


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

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

  1. 动态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

  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 )

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

参考文档:

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论