首页 > 数据库 >PB从入坑到放弃(六)动态SQL应用

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

时间:2023-08-07 22:22:26浏览次数:39  
标签:ename 存储 游标 empno 从入 PB ls 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

标签:ename,存储,游标,empno,从入,PB,ls,SQL
From: https://www.cnblogs.com/xiezhr/p/17612892.html

相关文章

  • 【MySQL入门到精通-黑马程序员】MySQL基础篇-SQL概述及DDL
    前言本专栏文章为观看黑马程序员《MySQL入门到精通》所做笔记,课程地址在这。如有侵权,立即删除。一、SQL1.1SQL通用语法SQL语句可以单行或多行书写,(默认)以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。注释:单行注释......
  • 2023-8-7 记录一次面试题,使用Sql进行递归
     题目如图所示,是数据库源,这次考官需要我用Sql,完成一次数据查询需要根据Excel数据查询结果如上图,这时候我看到了父子关系,很容易就联想到了需要使用父子关系,既然是父子关系,一般来说应该递归跑不掉了,使用Sql进行递归代码如下:WITHTEST_CTEAS(SELECT地区表1.地区编号,地区......
  • MySQL如何定位消耗CPU的SQL
    Mysql5.7版本以上在pfc下面的表threads表中添加了THREAD_OS_ID字段[[email protected]][test]>descperformance_schema.threads;+---------------------+------------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|......
  • Docker安装MySQL
    安装版本为MySQL8.0.131.拉取镜像#默认拉取最新镜像dockerpullmysqldockersearch<name>#https://hub.docker.com#在网站选择具体版本dockerpullmysql:8.0.132.创建挂载目录#建立宿主机数据库目录mkdir-p/home/docker/mysql/data#建立宿主机数据库配置文件......
  • Sql去重查询数据,存在部分字段相同 max(id)  和 group by配合使用
    Sql去重查询数据原文链接:https://blog.51cto.com/u_15910936/5932613最近在工作过程中,面试过程中, 部分求职者或者同事,对sql怎么去重查询,不是太熟练今天下午忙里偷闲,整理了一下 其实sql基本的查询,还是蛮有意思,  下面是我大致整理的几种去重查询 1.存在2条一样的数据, 使......
  • SqlServer时间格式化
       sqlserver日期格式化中文-年月日selectconvert(varchar,datepart(yy,getdate()))+N'年'+convert(varchar,datepart(mm,getdate()))+N'月'+convert(varchar,datepart(dd,getdate()))+N'日',cast(datepart(yy,getdate())asvarchar)+N'年......
  • RabbitMQ从入门到精通零基础进阶学习路线?
    RabbitMQ从入门到精通零基础进阶学习路线?学习RabbitMQ可以遵循以下路线,从入门到精通:步骤1:理解消息队列和RabbitMQ基础知识-学习什么是消息队列和为什么要使用它们。-了解RabbitMQ的概念和术语,如生产者、消费者、队列、交换器和绑定等。步骤2:安装和设置RabbitMQ-下载和安装Ra......
  • 支持多数据源联合查询的SQL运行引擎sycnany-SQL添加使用自定义函数
    在微服务和云原生愈发流行的今天,数据的分布也愈发脱离单库单机而更加复杂,使用的数据库类型也会更多,但业务的复杂依然会带来了大量的数据查询和导出需求,而很多时候我们很难为数据量的大部分系统创建完整的BI数仓系统,这时候你是不是觉得为这些需求查询和导出数据就会是一个十分困难且......
  • MySQL和MongoDB如何JOIN查询?一个直接在本地运行的SQL执行引擎
    在微服务和云原生愈发流行的今天,数据的分布也愈发脱离单库单机而更加复杂,使用的数据库类型也会更多,但业务的复杂依然会带来了大量的数据查询和导出需求,而很多时候我们很难为数据量的大部分系统创建完整的BI数仓系统,这时候你是不是觉得为这些需求查询和导出数据就会是一个十分困难且......
  • PLSQL客户端刚安装好后无法访问服务器数据库的解决方法
    1、正常安装PLSQL2、安装客户端oracle客户端工具:InstantClientSetup64w-oracle简易客户端.exe3、配置环境变量,在path中添加上面安装客户端工具的地址。4、打开plsql,即可看到登录下面多了一个选项,即可以登录使用了。......