PB从入坑到放弃(六)动态SQL应用

这篇具有很好参考价值的文章主要介绍了PB从入坑到放弃(六)动态SQL应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

动态 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文章来源地址https://www.toymoban.com/news/detail-631296.html

到了这里,关于PB从入坑到放弃(六)动态SQL应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PB从入坑到放弃(一)第一个HelloWorld程序

    网上关于 PowerBuilder 的资料确实是少之又少。 为了方便,后面我们都用 pb 来代替 PowerBuilder 说到这不得不来说说自己的 pb 入坑经历, 自己也不是计算机科班出生。 刚到公司面试,听到 pb 也是一脸懵逼,这啥东西,从来没听过。 然而,不知不觉已经干了好几年😔 也是有了这

    2024年02月11日
    浏览(44)
  • PB从入坑到放弃(七)PBer们的福音来了

    也许现在的你需要用PB完成毕业设计、需要维护远古时代的代码,又或者是你呆的公司就是要求要用PB开发项目。 不管你是出于什么原因还在使用PB,不可否认PB在数据窗口非常优秀,熟练使用之后开发数据库相关的应用非常高效 但由于PB这一框架出现得比较早,而且主要用于

    2024年02月14日
    浏览(38)
  • PowerBuilder从入坑到放弃(二)编码规范

    上一篇我们从0到1用 pb 开发了一个 helloworld 程序,并成功将开发的程序编译打包并且制作了安装包。 程序员最讨厌的莫过于写文档和别人不写注释。 不知道大家会不会和我一样,在找bug时,有段代码,心中不知默默的骂了它多少遍。 哪个sx写的这代码,研究了一段时间发现

    2024年02月12日
    浏览(41)
  • C桑(Cython)从入坑到入土(1)

    Cython 是一个将类似 Python 的代码文件编译为 C 代码的编译器。尽管如此,“Cython 不是 Python 到 C 的翻译器”。也就是说,它不会将完整的程序\\\"转换为 C\\\"------相反,结果会充分利用 Python 运行时环境。一种看待它的方式可能是,您的代码仍然是 Python,因为它在 Python 运行时环境

    2024年01月16日
    浏览(38)
  • MyBatis XML 映射文件中的 SQL 语句可以分为动态语句和静态语句

    目录 静态查询: 动态查询: 静态更新: 动态更新: 静态删除: 动态删除: 动态语句和静态语句在 MyBatis 中的作用如下: 静态查询: 静态查询是指在 SQL 语句中执行固定的查询操作,查询的条件和内容是预先确定的,不会随着用户输入或其他条件的改变而改变。以下是一

    2024年01月18日
    浏览(72)
  • mybtis动态SQL注解 脚本动态SQL\方法中构建SQL\SQL语句构造器

    分类 : 脚本动态SQL :XML配置方式的动态SQL,是用 script 的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置 方法中构建SQL :@SelectProvider 、@InsertProvider、@UpdateProvider、@DeleteProvider 这些方法的使用 SQL语句构造器 :实现动态 SQL 的内容 脚本动态SQL 在sql语句中加

    2024年01月21日
    浏览(53)
  • MyBatis动态sql之批量修改、批量新增(使用foreach标签的一条sql语句解决)

            批量新增和批量修改在业务中是很常见的,一条sql访问数据库和通过代码循环体中循环访问数据库做单个数据新增修改相比较下:一条sql访问数据库性能上明显提升,代码且简洁明了 1、Mapper.java中 说明: 参数是list  2、Mapper.xml中 说明: 通过trim标签拼接前后缀和

    2024年02月10日
    浏览(53)
  • 通过IService中提供的Lambda方法,简化复杂/动态sql语句的编写

    要求实现一个根据复杂条件查询用户的接口,查询条件如下: 1. name:用户名,可以为空 2. status:用户状态,可以为空 3. minBalance:最小余额,可以为空 4. maxBalance:最大余额,可以为空 可以理解成一个用户的后台管理界面,管理员可以自己选择条件来筛选用户,因

    2024年01月24日
    浏览(46)
  • MyBatis的代理开发方式、动态sql语句和typeHandlers和plugins标签实战

    接上篇博客: MyBatis基础知识和快速入门、MyBatis核心配置文件讲解,本文继续讲解MyBatis动态SQL语句、typeHandlers和plugins标签。 传统开发方式 编写UserDao接口 编写UserDaoImpl实现 mapper文件 测试传统方式 代理开发方式 代理开发方式介绍 采用 Mybatis 的代理开发方式实现 DAO 层的开发

    2023年04月27日
    浏览(43)
  • SQL中的CASE WHEN语句:从基础到高级应用指南

    我们使用一个名为\\\"Products\\\"的表,包含以下列:ProductID、ProductName、CategoryID、UnitPrice、StockQuantity。 示例展示 productID productName categoryID unitPrice stockQuantity 1 Laptop 1 800 50 2 Smartphone 1 500 100 3 T-shirt 2 20 200 4 Jeans 2 40 150 5 Headphones 1 100 75 1. CASE WHEN-基本使用 查询结果: ProductName UnitPric

    2024年02月09日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包