
写在前面
动态 SQL 语句是部分或者整个 SQL 语句在运行时才能确定,可以更好的与用户进行交互,大大提高了SQL的灵活性
一、执行SQL语句
1.1 执行无入参SQL
① 语法
EXECUTE IMMEDIATE SQLStatement &
② 说明
- SQLStatement –> 有效SQL语句字符串
- TransactionObject  –>事务对象名  省略时使用- SQLCA
③ 举个栗子
 删除员工信息表emp
string sql = "drop table emp"
EXECUTE IMMEDIATE :sql USING SQLCA;
1.2 执行带参数SQL
① 语法
PREPARE DynamicStagingArea FROM SQLStatement
&
EXECUTE DynamicStagingAreaUSING &
②说明
- 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 调用格式
Declare my_proce Procedure For prc_Test(:ls_a,:ls_b);  
Execute my_proce ;
If SQLCA.SQLCode <> 0 Then 
End If
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
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