写在前面

动态 SQL 语句是部分或者整个 SQL 语句在运行时才能确定,可以更好的与用户进行交互,大大提高了SQL的灵活性

一、执行SQL语句

1.1 执行无入参SQL

① 语法

EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ;

② 说明

  • SQLStatement --> 有效SQL语句字符串
  • TransactionObject -->事务对象名 省略时使用 SQLCA

③ 举个栗子

删除员工信息表emp

string sql = "drop table emp"
EXECUTE IMMEDIATE :sql USING SQLCA;

1.2 执行带参数SQL

① 语法

PREPARE DynamicStagingArea FROM SQLStatement
{USING TransactionObject} ;
EXECUTE DynamicStagingAreaUSING {ParameterList} ;

②说明

  • DynamicStagingArea -->默认全局变量是 SQLSA

  • SQLStatement -->有效的SQL语句,其中? 代表需要传入的参数。执行时问号被 EXECUTE 语句中的 USING 子句所代表的值

    取代

  • TransactionObject-->事务对象名,大括号表示该子句可以省略,省略时使用 SQLCA

  • ParameterList -->参数列表,可以是变量、常量或者控件的属性,各参数对应于 SQLStatement中的问号

③ 举个栗子

Ⅰ 删除员工编号56的员工信息

Int li_empno = 56
PREPARE SQLSA FROM "DELETE FROM emp WHERE empno=?" ;
EXECUTE SQLSA USING :li_empno ;

Ⅱ 新增一个员工信息

Prepare SQLSA from
"insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (?, ?, ?, ?, ?, ?, ?, ?)"
execute SQLSA using :ls_empno, :ls_ename, :ls_job, :ls_mgr, :ld_hiredate, :ld_sal, :ls_comm, :ls_deptno;

二 、使用游标

数据库中的游标可以看作是一个指针,它指向查询语句返回的结果集中的当前行。通过游标,我们可以逐行处理结果集

2.1 语法

① do while 语法

//定义游标
string test
//声明游标
declare test cursor for select 字段名 from 表名 where 条件 using sqlca;
//打开游标
open test;
//获取数据
fetch test into:字段名变量;
do while sqlca.sqlcode = 0
//在这里写你的业务
//再次获取数据
fetch test into:字段名变量;
loop
//关闭游标
close test;

② for 语法

long ll_count = 10
//定义游标
string test
//声明游标
declare test cursor for select 字段名 from 表名 where 表达式 using sqlca;
//打开游标
open test;
for i=1 to ll_count
//获取数据
fetch test into :变量名;
//在这里写你的业务
next
//关闭游标
close test;

2.2 举个栗子

上面具体说了游标的两种实现语法,接下来我们就分别用两种语法实现向下拉框中添加数据的功能

① 使用do while 语法向下拉框中添加员工信息

string ls_empno,ls_ename
ddlb_1.Reset () //重置下拉列表 DECLARE cur_empinfo CURSOR FOR
select empno,ename from emp; Open cur_empinfo; // 打开游标
If SQLCA.SqlCode = -1 Then //判断打开游标是否失败,失败则弹出提示信息
messagebox ('提示信息'+SQLCA.SqlErrText)
Return -1
End If Fetch cur_empinfo Into :ls_empno,:ls_ename;
ddlb_1.SetRedraw(False) //禁止下拉列表刷新
Do While SQLCA.SqlCode = 0
ddlb_1.AddItem (ls_empno+'-'+ls_ename) //向下拉列表添加数据
Fetch cur_empinfo Into :ls_empno,:ls_ename;
Loop
ddlb_1.SetRedraw(True) //刷新下拉列表
Close cur_empinfo; //关闭游标

② 使用for 语法向下拉框中添加员工信息

long ll_count = 10
string ls_empno,ls_ename
//定义游标
string cur_empinfo
//声明游标
declare cur_empinfo cursor for select empno,ename from emp where deptno = '20' using sqlca;
//打开游标
open cur_empinfo;
for i=1 to ll_count
//获取数据
fetch test into :ls_empno,:ls_ename;
//在这里写你的业务
ddlb_1.AddItem (ls_empno+'-'+ls_ename) //向下拉列表添加数据
next
//关闭游标
close cur_empinfo;

注: 使用游标过程中,打开了游标,业务处理完之后一定要关闭游标

三 、调用存储过程

存储过程是一组预编译的SQL代码块,它将一些复杂操作封装起来,并存储在数据库中。

由于存储过程在数据库中进行了预编译,并且能被多个客户端重复调用,可以减少网络开销,提高执行效率

3.1 调用格式

// 定义过程调用
// prc_Test 表示数据库中存储过程名称
// ls_a,ls_b 表示存储过程中的in类型入参
Declare my_proce Procedure For prc_Test(:ls_a,:ls_b); // 执行过程,这里是不需要其他参数的
Execute my_proce ; // 调用过程出现错误处理
If SQLCA.SQLCode <> 0 Then End If // 获取出参值,也就是OUT的变量,如果没有out类型的变量,这句也就不需要了
Fetch my_proce Into :ls_ReturnName; // 获取数据出现错误处理
If SQLCA.SQLCode <> 0 Then End If // 关闭调用
Close my_proce ;

3.2 举个栗子

① PB调用无入参存储过程

Ⅰ 创建存储过程

Create Or Replace Procedure prc_getEmplname(v_name Out Varchar2) As
--存储过程,有一个out类型参数,无入参
Begin
v_name := 'Jone';
End;

Ⅱ 调用存储过程

Declare my_proce Procedure For p_get_name;
//或者
Declare my_proce Procedure For p_get_name();

② PB调用有入参存储过程

Ⅰ 创建存储过程

我们来创建一个存储过程,根据部门编号和员工姓名给该员工涨1000块钱工资

CREATE OR REPLACE Procedure prc_incr_sal(pra_deptno in Varchar2,
pra_ename in varchar2,
pra_code out NUMBER, --执行代码
pra_errmsg out VARCHAR2) As
Begin
pra_code :=1;
pra_errmsg :=''; begin
update emp set sal=sal+1000 where deptno = pra_deptno and ename =pra_ename;
EXCEPTION
WHEN OTHERS THEN
pra_code := -1;
pra_errmsg := '更新员工薪水失败!'||SQLERRM;
END;
End prc_incr_sal;

Ⅱ 调用存储过程

string ls_deptno
string ls_ename
int li_AppCode
string ls_err
ls_deptno = "20"
ls_ename = "XIEZHR"
DECLARE my_prc PROCEDURE FOR PRC_INCR_SAL
(:ls_deptno, //员工编号
:ls_ename //员工姓名
); EXECUTE my_prc;
// 执行存储过程报错处理
IF SQLCA.SQLCode < 0 THEN
ls_err = SQLCA.SQLErrText
GOTO prcErr
END if
//获取存储过程出参数据
FETCH my_prc Into :li_AppCode, :ls_err ; //获取出参数据失败处理
IF SQLCA.SQLCode < 0 THEN GOTO prcErr IF li_AppCode < 0 THEN GOTO prcErr
//关闭存储过程
CLOSE my_prc; return 0 prcErr:
rollback;
messagebox('错误信息',)

四、小结

通过前面的三小节内容,相信你已经学会了在PB中怎么执行动态SQL语句?PB怎么调用数据库中存储过程?

PB怎么通过游标对SQL语句查询出的包含多条结果集的处理。这几种场景在PB中都是经常使用的。

以上就是本期的全部内容,希望对你有所帮助 (●'◡'●)

我们下期再见~ ヾ(•ω•`)o

PB从入坑到放弃(六)动态SQL应用的更多相关文章

  1. Mybatis学习笔记(六) —— 动态sql

    通过mybatis提供的各种标签方法实现动态拼接sql. 需求:根据性别和名字查询用户 查询sql: SELECT id, username, birthday, sex, address FROM ...

  2. <MyBatis>入门六 动态sql

    package org.maple.mapper; import org.apache.ibatis.annotations.Param; import org.maple.pojo.Employee ...

  3. 通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃

    1.基本信息: 2017/11/27,Check Point 软件技术部门报告了一个华为 HG532 产品的远程命令执行漏洞(CVE-2017-17215),Mirai的升级版变种中已经使用该漏洞.看 ...

  4. react 入坑笔记(六) - 组件的生命周期

    React 组件生命周期 详细参考: react 组件生命周期 组件的生命周期可分为三个状态: 1.Mounting:已经挂载/插入到真实 DOM 树上: 2.Updating:正在被重新渲染: 3. ...

  5. 微信小程序从入坑到放弃之坑十二:navigator无法跳转的坑

    转自:http://www.yilingsj.com/xwzj/2018-11-25/weixin-miniprogram-navigator.html 微信小程序中的页面跳转用navigator就行 ...

  6. Python从入坑到放弃!

    Python基础  python基础 python基础之 while 逻辑运算符 格式化输出等 python基础之 基本数据类型,str方法和for循环 python基础之 列表,元组,字典 pyth ...

  7. Mybatis框架基础入门(六)--动态sql

    主要是通过mybatis提供的各种标签方法实现动态拼接sql. 1.if标签 <!-- 根据条件查询用户 --> <select id="queryUserByWhere& ...

  8. webpack入坑之旅(六)配合vue-router实现SPA

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  9. vue2入坑随记(二) -- 自定义动态组件

    学习了Vue全家桶和一些UI基本够用了,但是用元素的方式使用组件还是不够灵活,比如我们需要通过js代码直接调用组件,而不是每次在页面上通过属性去控制组件的表现.下面讲一下如何定义动态组件. Vue.e ...

  10. oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)

    0   前言 用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列. 查阅资料后发现 Oracle 的自增列需要手动编写. ...

随机推荐

  1. 2022-12-15:寻找用户推荐人。写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2。 对于示例数据,结果为: +------+ | name | +------+ | Wil

    2022-12-15:寻找用户推荐人.写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2. 对于示例数据,结果为: ±-----+ | name | ±-----+ | Will ...

  2. 2021-01-10:linux中,我要看某一个进程的并发,通过什么命令去查?

    福哥答案2021-01-10:[答案来自此链接:](https://blog.csdn.net/sinat_31275315/article/details/108239492)方法一:PS在ps命令 ...

  3. 2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓。 n<=100000(10^5) n*

    2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓. n<=100000(10^5) ...

  4. 计算机网络 vlan

    目录 一.vlan的概念 二.vlan的优势 三.vlan的种类 四.静态vlan的配置 五.trunk的概念和配值 六.实验 一.vlan的概念 在传统的以太网中,所有的用户都是同一个广播域,当数据 ...

  5. odoo开发教程八:qweb引擎

    一:简介 QWeb是一个基于xml的模板引擎,用于生成HTML片段和页面,模板指令是写在xml标签中的以t-开头的属性,比如t-if如果要让一个标签不被渲染,可以采用t来包裹,这样会执行它里面的命令但 ...

  6. Firefox Quantum 向左,Google Chrome 向右

    今天,又重新安装了一下 Firefox Quantum-68.0 (64 位),不同的是这一次安装的是国际中文版,而不是北京谋智火狐的版本. 北京谋智火狐 国际中文版 总的来说,有几点体验: 在 ht ...

  7. tomghost

    思路: 先使用端口扫描,会发现22,8009,8080 8009的考察点:tomcat ajp协程属性设置导致的文件读取和文件执行. https://github.com/00theway/Ghost ...

  8. C/S架构和B/S架构两种数字孪生技术路线的区别是什么?

    山海鲸创造了一种CS和BS热切换的编辑模式,即CSaaS架构,可以在安装软件之后一键从软件的CS状态切换为一个BS服务器,让私有化部署变得十分轻松.具体效果可以参照下面的视频: (https://ww ...

  9. 龙芯电脑编译redis (loongarch)

    1.获取源码 源码地址:https://redis.io/download/#redis-downloads 最新版本是7.2,这里用redis5测试,最后一个版本是5.0.14 wget https ...

  10. Unity中的InitializeOnLoad特性:深入解析与实践

    Unity中的InitializeOnLoad特性:深入解析与实践 在Unity开发过程中,我们经常需要在编辑器启动时或脚本重新编译后执行一些操作,例如初始化数据.注册事件等.这时,我们可以使用Ini ...