proc_day02
来源:互联网 发布:淘宝立即购买灰色 编辑:程序博客网 时间:2024/04/21 00:24
九.sqlca通信区
9.1 概念
sqlca 本质上是一个结构体变量,每执行
一次sql都会把sqlca中的字段更新一遍。
所以执行完一次sql 可以通过sqlca获得
sql执行的相关信息。一条sql的执行信息
执行完sql之后要立即获取 否则会被下一
条sql覆盖掉。
9.2 通过sqlca 可以获取的信息
sqlca.sqlcode sql的执行状态
==0 sql执行正常
>0 异常发生 一般是违反约束
<0 数据库本身错误或者网络错误
sqlca.sqlerrd[2] 获取sql影响的数据行数
sqlca.sqlerrm.sqlerrmc
当sql出错时 可以获取错误消息内容
十. oraca 通信区
可以通过oraca 获取执行的sql语句
1.包含oraca
exec sql include sqlca;
exec sql include oraca;
2.这个通信消耗资源比较大 所有默认关闭
打开oraca
exec oracle option(oraca=yes);
3.设置sql的保存标志
oraca.orastxtf=0 默认 不保存sql
=1 sql出错时保存sql
=2 sql出现警告 或者出错
时保存
=3 都保存
4.获取sql
oraca.orastxt.orastxtc
十一. proc中如何嵌入sql语句
11.1 如何嵌入select
在select语句前 加 exec sql
和into 结合 把数据放入宿主变量
11.2 如何嵌入 ddl dml tcl
在这些语句前 加 exec sql
ddl中不能使用宿主变量
十二. proc 中如何嵌入 plsql语句
exec sql execute
begin
/* 这里相当于匿名块 */
end;
end-exec;
写一个存储过程 传入两个整数参数
然后把两个参数的和放入第二个参数中。
create or replace procedure proGetSum
(var_x number,var_y in out number)
is
begin
var_y:=var_x+var_y;
end;
/
proc ***.pc sqlcheck=semantics
userid=openlab/open123
userid 在预编译时连接数据库 确认
存储过程 和 函数 是否存在与合法。
写一个plsql函数 传入两个整数参数 返回
这两个参数的最大值。再写一个proc程序
调用这个函数 要求参数必须使用宿主变量
验证这个函数的功能。
create or replace function getMax(
x in number,y in number)return number
is
begin
if x<y then
return y;
end if;
return x;
end;
/
十三.远程连接
本地连接
exec sql connect:username/passwd;
exec sql connect:name identified by
:passwd;
/* 数据库的服务名或者实例名 */
echo $ORACLE_SID
远程连接:
$ORACLE_HOME/network/admin/
tnsnames.ora
CAH_192.168.0.26 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.26)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = tarena)
)
)
区分具体的数据库 使用 using
区分具体的连接 使用 at
exec sql connect:userpasswd at :标签;
exec sql connect:userpasswd at :标签2
using :远程数据库描述;
在每个操作前 exec sql at:标签名
第二种远程数据库连接方式
使用 database link
create database link 链接名 connect
to 用户名 identified by 密码
using '远程数据库描述';
create database link my23to26link
connect to openlab identified by
open123 using 'CAH_192.168.0.26';
exec sql select id,first_name
from s_emp@my23to26link where id=1;
exec sql update s_emp@my23to26link
set salary=17500 where id=1;
exec sql commit;
使用database link my23to26link
查询对应 s_emp 表中id=1的first_name
并打印这个数据 。查询本地数据库
中s_emp id=1 的first_name 并打印.
最后使用这个database link 把id=2
的salary 更新成12345 。
十四.数据的数据操作时的错误处理
14.1 使用单个变量 可以操作单行单列
局部错误处理 sqlca.sqlcode
exec sql select first_name
into :var_name
from s_emp where id=1;
proc 对错误的默认处理方式
(采用默认继续处理的方式)
这样可以获取到每条语句的执行状态
尽而根据状态对数据的事务进行控制。
比如 转账
exec sql update account
set money=money-5000
where ano='A';
a=sqlca.sqlcode;
exec sql update account
set money=money+5000
where ano='B';
b=sqlca.sqlcode;
if(!a&&!b){
exec sql commit;
}else{
exec sql rollback;
}
14.2 全局错误处理
100 条sql
进行统一化处理 而不是局部的错误处理
exec sql whenever 条件 动作;
条件: sqlerror notfound sqlwarning
动作: do 函数();
do break;
continue;
goto 标签;
stop;
当sql出错时 就向上找一个whenever语句
如果错误的类型匹配就采用whenever后
的动作如果不匹配就继续向上找,找不到
就忽略错误。
可以采用全局 加局部的错误处理方式
先执行全局处理再执行局部错误处理。
十五.proc中数据的操作
15.1 使用单个变量操作单行单列
exec sql select first_name into
:var_name from s_emp
where id=1;
15.2 使用多个变量操作单行多列
exec sql select id, first_name,salary
into :id,:var_name,:salary
from s_emp where id=1;
15.3 proc 中使用结构体 替代多个变量
struct{
int id;
char name[30];
double salary;
}emp;
struct emp{
int id;
char name[30];
double salary;
}emp;
typedef struct emp{
int id;
char name[30];
double salary;
}emp;
结构体定义 推荐放入申明区
否则在procc++中不能识别出类型
15.4 把s_emp 表中所有的id first_name
salary 放入一个结构体数组中。然后把
这个结构体数据中的数据 存入一张提前
建立好的表中。
15.5 proc 中的游标
15.5.1 非滚动游标
声明游标
exec sql declare 游标名
cursor for select语句;
打开游标
exec sql open 游标名;
提取数据 处理数据
exec sql fetch 游标名
into 变量;
关闭游标
exec sql close 游标名;
15.5.2 把s_emp 表中所有的id
first_name salary 放入一个游标
中。然后提取游标的前两条数据。
15.5.3 如何提取游标中所有的数据
exec sql whenever notfound
do break;
15.5.4 滚动游标
可以不按照顺序提取游标中的数据
scroll
last 最后一行
first 第一行
prior 当前行的前一行
next 当前行的后一行
current 当前行
relative n n是正数就是向后
n是负数就是向前
absolute n 绝对的第几行
9.1 概念
sqlca 本质上是一个结构体变量,每执行
一次sql都会把sqlca中的字段更新一遍。
所以执行完一次sql 可以通过sqlca获得
sql执行的相关信息。一条sql的执行信息
执行完sql之后要立即获取 否则会被下一
条sql覆盖掉。
9.2 通过sqlca 可以获取的信息
sqlca.sqlcode sql的执行状态
==0 sql执行正常
>0 异常发生 一般是违反约束
<0 数据库本身错误或者网络错误
sqlca.sqlerrd[2] 获取sql影响的数据行数
sqlca.sqlerrm.sqlerrmc
当sql出错时 可以获取错误消息内容
十. oraca 通信区
可以通过oraca 获取执行的sql语句
1.包含oraca
exec sql include sqlca;
exec sql include oraca;
2.这个通信消耗资源比较大 所有默认关闭
打开oraca
exec oracle option(oraca=yes);
3.设置sql的保存标志
oraca.orastxtf=0 默认 不保存sql
=1 sql出错时保存sql
=2 sql出现警告 或者出错
时保存
=3 都保存
4.获取sql
oraca.orastxt.orastxtc
十一. proc中如何嵌入sql语句
11.1 如何嵌入select
在select语句前 加 exec sql
和into 结合 把数据放入宿主变量
11.2 如何嵌入 ddl dml tcl
在这些语句前 加 exec sql
ddl中不能使用宿主变量
十二. proc 中如何嵌入 plsql语句
exec sql execute
begin
/* 这里相当于匿名块 */
end;
end-exec;
写一个存储过程 传入两个整数参数
然后把两个参数的和放入第二个参数中。
create or replace procedure proGetSum
(var_x number,var_y in out number)
is
begin
var_y:=var_x+var_y;
end;
/
proc ***.pc sqlcheck=semantics
userid=openlab/open123
userid 在预编译时连接数据库 确认
存储过程 和 函数 是否存在与合法。
写一个plsql函数 传入两个整数参数 返回
这两个参数的最大值。再写一个proc程序
调用这个函数 要求参数必须使用宿主变量
验证这个函数的功能。
create or replace function getMax(
x in number,y in number)return number
is
begin
if x<y then
return y;
end if;
return x;
end;
/
十三.远程连接
本地连接
exec sql connect:username/passwd;
exec sql connect:name identified by
:passwd;
/* 数据库的服务名或者实例名 */
echo $ORACLE_SID
远程连接:
$ORACLE_HOME/network/admin/
tnsnames.ora
CAH_192.168.0.26 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.26)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = tarena)
)
)
区分具体的数据库 使用 using
区分具体的连接 使用 at
exec sql connect:userpasswd at :标签;
exec sql connect:userpasswd at :标签2
using :远程数据库描述;
在每个操作前 exec sql at:标签名
第二种远程数据库连接方式
使用 database link
create database link 链接名 connect
to 用户名 identified by 密码
using '远程数据库描述';
create database link my23to26link
connect to openlab identified by
open123 using 'CAH_192.168.0.26';
exec sql select id,first_name
from s_emp@my23to26link where id=1;
exec sql update s_emp@my23to26link
set salary=17500 where id=1;
exec sql commit;
使用database link my23to26link
查询对应 s_emp 表中id=1的first_name
并打印这个数据 。查询本地数据库
中s_emp id=1 的first_name 并打印.
最后使用这个database link 把id=2
的salary 更新成12345 。
十四.数据的数据操作时的错误处理
14.1 使用单个变量 可以操作单行单列
局部错误处理 sqlca.sqlcode
exec sql select first_name
into :var_name
from s_emp where id=1;
proc 对错误的默认处理方式
(采用默认继续处理的方式)
这样可以获取到每条语句的执行状态
尽而根据状态对数据的事务进行控制。
比如 转账
exec sql update account
set money=money-5000
where ano='A';
a=sqlca.sqlcode;
exec sql update account
set money=money+5000
where ano='B';
b=sqlca.sqlcode;
if(!a&&!b){
exec sql commit;
}else{
exec sql rollback;
}
14.2 全局错误处理
100 条sql
进行统一化处理 而不是局部的错误处理
exec sql whenever 条件 动作;
条件: sqlerror notfound sqlwarning
动作: do 函数();
do break;
continue;
goto 标签;
stop;
当sql出错时 就向上找一个whenever语句
如果错误的类型匹配就采用whenever后
的动作如果不匹配就继续向上找,找不到
就忽略错误。
可以采用全局 加局部的错误处理方式
先执行全局处理再执行局部错误处理。
十五.proc中数据的操作
15.1 使用单个变量操作单行单列
exec sql select first_name into
:var_name from s_emp
where id=1;
15.2 使用多个变量操作单行多列
exec sql select id, first_name,salary
into :id,:var_name,:salary
from s_emp where id=1;
15.3 proc 中使用结构体 替代多个变量
struct{
int id;
char name[30];
double salary;
}emp;
struct emp{
int id;
char name[30];
double salary;
}emp;
typedef struct emp{
int id;
char name[30];
double salary;
}emp;
结构体定义 推荐放入申明区
否则在procc++中不能识别出类型
15.4 把s_emp 表中所有的id first_name
salary 放入一个结构体数组中。然后把
这个结构体数据中的数据 存入一张提前
建立好的表中。
15.5 proc 中的游标
15.5.1 非滚动游标
声明游标
exec sql declare 游标名
cursor for select语句;
打开游标
exec sql open 游标名;
提取数据 处理数据
exec sql fetch 游标名
into 变量;
关闭游标
exec sql close 游标名;
15.5.2 把s_emp 表中所有的id
first_name salary 放入一个游标
中。然后提取游标的前两条数据。
15.5.3 如何提取游标中所有的数据
exec sql whenever notfound
do break;
15.5.4 滚动游标
可以不按照顺序提取游标中的数据
scroll
last 最后一行
first 第一行
prior 当前行的前一行
next 当前行的后一行
current 当前行
relative n n是正数就是向后
n是负数就是向前
absolute n 绝对的第几行
0 0