PB从入坑到放弃(六)动态SQL应用 - xiezhr
source link: https://www.cnblogs.com/xiezhr/p/17612892.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
动态
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 = 56PREPARE 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_enameddlb_1.Reset () //重置下拉列表 DECLARE cur_empinfo CURSOR FOR select empno,ename from emp; Open cur_empinfo; // 打开游标If SQLCA.SqlCode = -1 Then //判断打开游标是否失败,失败则弹出提示信息 messagebox ('提示信息'+SQLCA.SqlErrText) Return -1End 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; Loopddlb_1.SetRedraw(True) //刷新下拉列表Close cur_empinfo; //关闭游标
② 使用for 语法向下拉框中添加员工信息
long ll_count = 10string 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) AsBegin 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_deptnostring ls_enameint li_AppCodestring ls_errls_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 prcErrEND 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
Recommend
-
5
-
1
这期呢主要说一说Linux中与网络相关命令,一共包含19个命令
-
3
周所周知MySQL已成为全世界最受欢迎的数据库之一。无论你用的何种编程语言在开发系统,数据库基本上都是必不可少的。 无论是小型项目开发如我们开发一个个人博客系统,还是构建那些声名显赫的网站如某宝、某讯等,MySQL都有着稳定、可靠、快速等优点。可以胜任...
-
4
根据上一篇文章【必知必会的MySQL知识】①初探MySQL的内容,想必您对MySQL数据库有了一个整体的了解了,并且应该在自己电脑上已经安装上了MySQL。 这一篇呢我们来说...
-
10
【必知必会的MySQL知识】③DML语言 前面的两篇文章中,我...
-
4
【必知必会的MySQL知识】④DCL语言 数据控...
-
4
上一节中我们说了DML 数据操作语言,这一篇到了DQL语言,DQL语言就是我们常说的select 语句。 它是从一个表或多个表中根据各种条件,检索出我们想要的数据集。 DQL语句算是我们工作中最长用也是最复杂的SQL语句了。 二、基础查...
-
3
一、Oracle定时任务简介 Oracle定时任务是在oracle系统中一个非常重要的子系统,运用得当,可以大大提高我们系统运行和维护能力。oracle定时任务的功能,可以在指定的时间点自行执行任务。 那么在实际工作中,什么样的场...
-
1
合集 - PB从入坑到放弃(1)1.PB从入坑到放弃(一)第一个HelloWorld程序07-03 网上关于PowerBuilder的资料...
-
0
上一篇我们从0到1用pb开发了一个helloworld程序,并成功将开发的程序编译打包并且制作了安装包。 程序员最讨厌的莫过于写文档和别人不写注释。 不知道大家会不会和我一样,在找bug时,有段代码,心中不知默默的骂了它多少遍...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK