/*
达内学习 Oracle day44 2013-11-4
*/
回忆:
a,使用varchar 来处理变长字符串,在sql中正常使用,在宿主语言中用.arr取出
防止乱码, 初始化, .arr[.len]='\0'
b,proc预编译选项
iname cname char_map = string
宿主变量的注意事项:
1,要求宿主变量放入申明区
exec sql begin declare section;
exec sql end declare section;
2,可以使用指针 不推荐
3,ddl中不能使用宿主变量
4,在sql语句中使用宿主变量时候 前面要加冒号
4 ,指示变量
当数据库中的字段值, 赋值给宿主变量时候,赋值的状态可以通过指示变量得到
==0 赋值正常
== -1 数据库中字段值是null
>0 阶段赋值 尽量避免
short 类型
: 宿主变量:指示变量
: 宿主变量 indicator: 指示变量
5 ,数组变量
proc只支持一维数组 字符除外
不能使用数组指针
最大元素个数 32767
在 select 语句中,只能出现数组名 不能出现下标
6,sqlca通信区
一个事务中的sql语句 每执行一句都会把一个叫sqlca的结构体,的所有字段更新一遍
sqlca.sqlerrd[2] sqlca中影响的行数
sqlca.sqlcode sql语句执行的状态
== 0 正常
>0 异常发生
<0 系统错误(网络错误)
sqlca.sqlerrm.sqlerrmc sql出错信息
7,oraca 通信区
对sqlca 的信息补充,消耗资源比较大,默认关闭状态
从oraca中取得执行的sql语句
1,包含oraca
exec sql include oraca;
2,打开oraca
exec oracle option(oraca=yes);
3, 设置sql的保存标志
oraca.orastxtf=0 默认状态 不保存sql
=1 出现错误时保存
=2 出现警告或者错误保存
=3 所有都保存
4,得到sql语句
oraca.orastxt.orastxtc
proc 中select的占位符和 plsql中是一样的
8, proc 中最重要最简单的内容
proc 中如何嵌入sql语句
a,select语句
在select语句前 在 exec sql
select 语句要和into:宿主变量结合
exec sql select first_name into :var_name where id = :id;
b,dml intsert delete update
tcl comimit rollback savepoint
ddl create drop alter
只需在前面家exec sql
ddl中不能出现宿主变量
9, proc中如何调用plsql
a,proc中如何调用存储过程
设计一个存储过程 传入两个整数参数 ,把两个参数的和存入第二个参数中
create or replace procedure getsum(x int number ,y in out number)
is
begin
y:= x+y;
end;
exec sql execute
begin
/* 相当于匿名快 */
end;
end-exec;
预编译时需要两个预编译选项
selcheck=semantics
userid=用户名/密码 在预编译时链接 数据库确定存储过程中是否存在并检查存储过程的合法性
proc sqlcheck=semantics callprocedure.pc userid = openlab/open123
b,proc 中如何调用函数
写一个函数 传入两个整数参数,返回两个参数最大值,并把两个参数的和放入第二个参数中,两个参数必须使用proc的宿主参数 验证函数的功能
10. 远程数据库链接
本地数据库链接
exec sql connect:userpasswd;
EXEC SQL CONNECT :userName IDENTIFIED BY :userPwd;
默认链接的是
echo $ORACLE_SID 得到数据库服务名
远程数据库链接
char userPwd[20] = “scott / tiger”;
char dbString[20] = “remoteDB”;
EXEC SQL CONNECT : userPwd Using :dbString;
remoteDB 是网络服务名, 在
$ORACLE_HOME/network/admin/tnsnames.ora文件中定义.
exec sql connect: userpasswd;
为了远程链接
char rdbdes[30]="CAH_192.168.0.26";
/* 直接和远程数据库 建立链接 */
exec sql connect:userpasswd using:redbdes;
exec sql connect:userpasswd;
/* 后面的操作无法区分在数据库链接上的操作 */
at 关键字后面可以跟一个标签
char db23[20]="db23";
exec sql connect:userpasswd at :db23
exec sql connect:userpassed at:db26 using:redbdes;
using 后面跟数据库描述
at 后的数据是用于区分数据库链接的
insufficient privileges 权限不足
create darabase link my26link onnect to openlab identifide by open123
{}
update s_emp@my26link set salary = 1200 where id=1;
远程数据库的事务 交给本地数据库控制
11,proc中的异常处理
sqlca.sqlcode 得到sql语句的执行状态
exec sql whenever 条件 动作
条件:sqlerror notfound sqlwarnng
动作:do 错误处理函数
do break;
continue;
stop;
goto 标签;
12.数据的操作
a,使用单个变量 一次操作单行数据
exec sql select first_name into :var_name from s_emp where id=1;
b,使用多个变量一次操作单行多列
exec sql select first_name,salary into :var_name,:varsal from s_emp where id =1;
c,使用结构体操作单行多列
C++ 中要求把结构体的定义放入申明区
d,数组变量可以操作多行多列
f,游标操作多行多列
proc中的游标使用步骤
1,声明游标
exec sql declare 游标名 cursor for sql语句;
2,打开游标
exec sql open 游标名;
3,提取数据 处理数据
exec sql fetch 游标名 into: 结构变量;
4,关闭游标
exec sql close 游标名;
如何 遍历游标中所有的数据:
exec sql whenever notfound do break;
滚动游标:可以不按照顺序访问
scroll cursor
last first
prior 前一个
next 下一个
current 当前
relative n相对当前 正向后 负数向前
absolute n绝对
13,动态sql
1,把一条字符串 对应的sql 当作真正的sql来执行
动态sql
不能有select 语句
不能有:占位符
exec sql execute immediate :sqlstr;
2,可以有展位符,不能有select
exec sql prepare s from :sqlstr;
exec sql execute using :宿主变量
3,只能是select 可以有占位符 动态sql2 和 游标的结合
“select id,first_name,salary from s_emps”
动态sql2 和游标的结合
char sqlstr[100]="seleect id,first_name,salaryfrom s_emp where id>b 0";
int id =15;
exec sql prepare s from :sqlstr;
exec sql declare empcursor cursor for s;
exec sql open empcursor using:id;
------------------------------------------------
列出相关null相关的知识
1,nvl(par1,par2)
不为空返回第一个,为空返回第二个,类型要求一致
2,where 字段 is null
3,排序
4,表链接 内链接 外链接 等值 非等值 自连接 (+)
5,组函数和分组
6,子查询
7,DDL
8,约束
9,三范式
10,其他对象
序列 索引 视图 分页