:1、proc中使用qlsql
1.1、语法
exec sql execute
begin
/*相当于qlsql的匿名库*/
end;
end-exec;
在预编译的时候,需要增加两个预编译选项:
sqlcheck=semantics
userid=用户名/密码 //使用userid的目的,在预编译时连接数据库,检查调用的过程,函数等是否存在,调用方式是否正确。
1.2、proc中调用存储过程
1) 创建一个存储过程
根据指定id 查询员工的first_name
create or replace procedure proc_lx_42(sid number,name out varchar2) is
begin
select first_name into name from s_emp where id=sid;
end;
/
declare
id number(7):=1;
name varchar2(25);
begin
proc_lx_42(id,name);
dbms_output.put_line(name);
end;
/
2) 调用
案例:callprocedure.pc
1.3、调用函数
1) 创建函数
创建一个函数,传入两个数字,返回最大值,同时把两数之和保存在第二个参数
create or replace function func_lx_42(one number,two in out number) return number is
var_temp number;
begin
var_temp:=two;
two:=one+two;
if one>var_temp then
return one;
end if;
return var_temp;
end;
/
2)
案例:callfunction.pc
2、数据库的连接
2.1、本地数据库连接
exec sql connect:用户名/密码
exec sql connect:用户名 identified by :密码;
2.2、远程数据库连接
需要提供一个描述,描述运程的数据库。包括:ip地址、端口号、oracle数据库的服务ID(服务名)。
%ORACLE_HOME/network/admin/tnsnames.ora文件中有远程数据库描述的配置
$ORACLE_HOME:环境变量 oracle的安装路径
char rdbdesc[]="DB20";
exec sql connect:userpasswd using :rdbdesc;
案例:rdbconn.pc
2.3、连接多个数据库
3、错误处理
3.1、局部错误处理
sqlca.sqlcode
3.2、全局错误处理
错误处理方案只写一次,可以多次使用
语法:
exec sql whenever 条件 动作;
其中,条件-----条件类型,有三种:
sqlerror-----sql语句错误
notfound-----没有找到数据
sqlwarning---sql语句出现警告(不常用)
动作-----错误处理方案,有多种:
do 错误处理函数(); ---一旦出现错误,调用函数
do break; ---推出循环
continue; ---继续运行
stop; ---停止运行
goto 标签; ---跳转
3.3、案例
sqlerror.pc
执行sql语句时,如果出现了错误,向上查找匹配的错误处理语句,并执行错误处理方案,之后继续执行后面的操作
4、proc中的数据处理
1) 单行单列的结果集 一个宿主变量
exec sql select first_name into :name from s_emp where id=1;
2) 单行多列的结果集 多个宿主变量或者结构体变量
exec sql select id,first_name into :id,:name from s_emp where id=1;
案例:使用结构体变量接受单行多列的结果集
selecta.pc
3) 多行单列的结果集 一个数组
exec sql first_name into :names from s_emp;
4) 多行多列的结果集 多个数组或结构体数组或者游标
exec sql id,first_name into :ids,:names from s_emp;
案例:使用结构体数组接受多行多列的结果集
selectb.pc
案例:使用游标接受多行多列的结果集
selectc.pc
a.声明游标
exec sql declare 游标名 cursor for select语句;
b.打开游标
exec sql open 游标名;
c.提取数据
exec sql fetch 游标名 into :宿主变量;
d.关闭游标
exec sql close 游标名;
游标在提取数据时,会用到循环,退出循环的方式:
exec sql whenever notfound do break;
有一种滚动游标,可以直接跳转到结果集的任何位置,在使用上和普通游标(顺序游标)的差别
1、声明滚动游标时,关键字是 scroll cursor
exec sql declare 游标名 scroll cursor for select 语句;
2、fetch时,有多种方式:
fetch first 提取第一行
fetch last 提取最后一行
fetch next 提取当前行的下一行
fetch prior 提取当前行的上一行
fetch absolute n 提取第n行
fetch relative n 提取从当前行开始的第n行
fetch current 提取当前行
比如:
exec sql fetch absolute 10 游标名 into :宿主变量;
案例 selectd.pc
案例:使用游标,便利s_dept表中的全部数据
5、动态sql
proc中常用的动态sql有三种情况:
1) 非select语句,没有占位符(不使用宿主变量)
char sqlstr[100] = "create table ...";
exec sql execute immediate :sqlstr;
案例:dsqla.pc
2) 非select语句,有占位符(使用宿主变量)
char sqlstr[100] = "insert into 表名 values(:b0,...)";
exec sql prepare s from :sqlstr;
exec sql execute s using :宿主变量,...;
案例:dsqlb.pc
3) select语句
char sqlstr[100] = "select 字段列表 from 表名";
exec sql prepare s from :sqlstr;
exec sql declare 游标名 cursor for s;
案例:dsqlc.pc
c++ 编译
proc oracledao.pc parse=none code=cpp oname=oracledao.cpp
学习笔记day69-----oracle-proc-在C/C++中使用ql/sql语法的方法
最新推荐文章于 2022-07-21 11:11:00 发布