一、proc如何使用sql语句
1.select 语句 只要在语句前 加exec sql 并且结合 into 使用
exec sql select first_name into :var_name from s_emp where id=1;
2.dml(insert delete update)
ddl(create drop alter)
tcl(commit rollback savepoint)
直接在语句前加 exec sql 即可
ddl中不能使用宿主变量
二、proc中如何使用PLSQL
1.使用PLSQL的语法
exec sql execute
begin
/* 这里相当于匿名块 */
end;
end-exec;
在proc预编译时 需要使用两个选项
sqlcheck=semantics
userid=用户名/密码
2.proc中如何调用存储过程
a.写一个存储过程 传入两个整数参数
然后把这两个整数参数的和 存入第二个参数中
create or replace procedure getsum(x in number,y in out number)
is
begin
y:=x+y;
end;
b.写一个proc程序验证存储过程
3.proc 中如何调用函数
a.设计一个plsql的函数 传入两个整数参数 返回这两个整数参数的最大值 写一个proc程序验证
create or replace function getmaxnum(x in number,y in number) return number
is
begin
if x>y then
return x;
else
return y;
end if;
end;
三、数据库连接
1.本地数据库
exec sql connect:用户名/密码;
exec sql connect:用户名 identified by:密码;
2.远程数据库连接
$ORACLE_HOME/network/admin/tnsnames.ora
得到某个机器上的oracle服务器名
echo $ORACLE_SID
3.使用using:远程数据库描述符号 就可以区分不同的数据库。
有多个数据库连接时 需要使用at:标签 来区分具体的连接
只需要在每个数据库操作前 加上exec sql at:标签名 即可
4.使用database link 进行远程数据库连接;
建立database link 的语法
create database link 链接名
connect to 用户名 indentified by 密码 using '远程数据库描述';
在sqlplus中建立 35 到179的远程连接
create database link my35_179zjlink
connect to openlab identified by open123 using '192.168.40.179';
报错:重复链接或者权限不够
本地操作
select id,first_name from s_emp where id=1;
远程操作
select id,first_name from s_emp@my35_179zjlink where id=1;
给id等于1,的人涨工资
select id,first_name,salary from s_emp@my35_179zjlink where id=1;
update s_emp@my35_179zjlink where id=1;
update s_emp@my35_179zjlink set salary=salary+100 where id=1;
远程数据库的事物交给本地操作
create database link my35_179link
connect to openlab identified by open123 using
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.40.179)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
总结:必须先登陆本地的数据库 然后才能使用数据库中的链接。链接可以建立多个。远程数据的事物交给本地数据库来控制。
四、proc中的异常处理
1. sqlca.sqlcode 来判断sql语句的执行状态,局部的错误处理;
2. proc中的全局错误处理方式
exec sql whenever 条件 动作
条件:sqlerror notfound sqlwarning
动作:do 错误处理函数名();
do break; 终止循环
continue;
stop;
goto 标签;
3.举例
把s_emp 表 删除表
总结:proc中sql出错之后,向上查找 exec sql whenever 语句 如果找到就执行whenever语句对应的动作。如果找不到就采用系统默认的忽略处理
五、proc中的数据处理
1.使用单个变量处理 单行单列
exec sql select 字段名 into :宿主变量 from 表名 where 条件;
2.使用多个变量 一次操作单行多列
exec sql select first_name,salary into :var_name,:var_salary from s_emp where id=1;
3.使用结构体 操作 单行多列
struct{
int id;
char name[30];
double salary;
} emp;
struct emp{
int id;
char name[30];
double salary;
} emp;
4.使用结合结构体 和 数组操作多行多列
把s_emp表中所有的id,first_name,salary 放入一个结构体数组中
5.使用游标操作 多行多列
1).游标的使用步骤
a.声明游标
exec sql declare 游标名 cursor for select 语句;
b.打开游标
exec sql open 游标名;
c.提取数据
exec sql fetch 游标名 into 宿主变量;
d.关闭游标
exec sql close 游标名;
2).举例
把s_emp表中所有的id,first_name,salary 放入游标中
3).把上面的游标代码复制一份,然后考虑如何遍历出游标中所有的数据
4).滚动游标
可以不按照顺序 提取数据
scroll
fetch last 最后一条数据
fetch first 第一条数据
fetch prior 当前的前一行数据
fetch next 当前的后一行
fetch relative n 正数向后,负数向前
fetch absolute n 绝对的第几条
fetch current 当前数据
六、动态sql
1.不能是select语句
不能有占位符
exec sql execute immediate :sqlstr;
2.可以有占位符 :b0 :b1
不能是select语句
/* 预处理 */
exec sql prepare s from :sqlstr;
exec sql execute s using:宿主变量;
3.只能是select语句
可以有占位符
"select id,first_name,salary from s_emp where id>:bo"
动态sql2+游标的形式
核心思想:把预处理的串 关联到游标上
1.select 语句 只要在语句前 加exec sql 并且结合 into 使用
exec sql select first_name into :var_name from s_emp where id=1;
2.dml(insert delete update)
ddl(create drop alter)
tcl(commit rollback savepoint)
直接在语句前加 exec sql 即可
ddl中不能使用宿主变量
二、proc中如何使用PLSQL
1.使用PLSQL的语法
exec sql execute
begin
/* 这里相当于匿名块 */
end;
end-exec;
在proc预编译时 需要使用两个选项
sqlcheck=semantics
userid=用户名/密码
2.proc中如何调用存储过程
a.写一个存储过程 传入两个整数参数
然后把这两个整数参数的和 存入第二个参数中
create or replace procedure getsum(x in number,y in out number)
is
begin
y:=x+y;
end;
b.写一个proc程序验证存储过程
3.proc 中如何调用函数
a.设计一个plsql的函数 传入两个整数参数 返回这两个整数参数的最大值 写一个proc程序验证
create or replace function getmaxnum(x in number,y in number) return number
is
begin
if x>y then
return x;
else
return y;
end if;
end;
三、数据库连接
1.本地数据库
exec sql connect:用户名/密码;
exec sql connect:用户名 identified by:密码;
2.远程数据库连接
$ORACLE_HOME/network/admin/tnsnames.ora
得到某个机器上的oracle服务器名
echo $ORACLE_SID
3.使用using:远程数据库描述符号 就可以区分不同的数据库。
有多个数据库连接时 需要使用at:标签 来区分具体的连接
只需要在每个数据库操作前 加上exec sql at:标签名 即可
4.使用database link 进行远程数据库连接;
建立database link 的语法
create database link 链接名
connect to 用户名 indentified by 密码 using '远程数据库描述';
在sqlplus中建立 35 到179的远程连接
create database link my35_179zjlink
connect to openlab identified by open123 using '192.168.40.179';
报错:重复链接或者权限不够
本地操作
select id,first_name from s_emp where id=1;
远程操作
select id,first_name from s_emp@my35_179zjlink where id=1;
给id等于1,的人涨工资
select id,first_name,salary from s_emp@my35_179zjlink where id=1;
update s_emp@my35_179zjlink where id=1;
update s_emp@my35_179zjlink set salary=salary+100 where id=1;
远程数据库的事物交给本地操作
create database link my35_179link
connect to openlab identified by open123 using
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.40.179)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
总结:必须先登陆本地的数据库 然后才能使用数据库中的链接。链接可以建立多个。远程数据的事物交给本地数据库来控制。
四、proc中的异常处理
1. sqlca.sqlcode 来判断sql语句的执行状态,局部的错误处理;
2. proc中的全局错误处理方式
exec sql whenever 条件 动作
条件:sqlerror notfound sqlwarning
动作:do 错误处理函数名();
do break; 终止循环
continue;
stop;
goto 标签;
3.举例
把s_emp 表 删除表
总结:proc中sql出错之后,向上查找 exec sql whenever 语句 如果找到就执行whenever语句对应的动作。如果找不到就采用系统默认的忽略处理
五、proc中的数据处理
1.使用单个变量处理 单行单列
exec sql select 字段名 into :宿主变量 from 表名 where 条件;
2.使用多个变量 一次操作单行多列
exec sql select first_name,salary into :var_name,:var_salary from s_emp where id=1;
3.使用结构体 操作 单行多列
struct{
int id;
char name[30];
double salary;
} emp;
struct emp{
int id;
char name[30];
double salary;
} emp;
4.使用结合结构体 和 数组操作多行多列
把s_emp表中所有的id,first_name,salary 放入一个结构体数组中
5.使用游标操作 多行多列
1).游标的使用步骤
a.声明游标
exec sql declare 游标名 cursor for select 语句;
b.打开游标
exec sql open 游标名;
c.提取数据
exec sql fetch 游标名 into 宿主变量;
d.关闭游标
exec sql close 游标名;
2).举例
把s_emp表中所有的id,first_name,salary 放入游标中
3).把上面的游标代码复制一份,然后考虑如何遍历出游标中所有的数据
4).滚动游标
可以不按照顺序 提取数据
scroll
fetch last 最后一条数据
fetch first 第一条数据
fetch prior 当前的前一行数据
fetch next 当前的后一行
fetch relative n 正数向后,负数向前
fetch absolute n 绝对的第几条
fetch current 当前数据
六、动态sql
1.不能是select语句
不能有占位符
exec sql execute immediate :sqlstr;
2.可以有占位符 :b0 :b1
不能是select语句
/* 预处理 */
exec sql prepare s from :sqlstr;
exec sql execute s using:宿主变量;
3.只能是select语句
可以有占位符
"select id,first_name,salary from s_emp where id>:bo"
动态sql2+游标的形式
核心思想:把预处理的串 关联到游标上