oracle 存储过程及REF CURSOR的使用
基本使用方法及示例
1、基本结构:
CREATE OR REPLACE PROCEDURE 存储过程名字
(参数1 IN NUMBER,参数2 IN NUMBER)
AS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字
2、无参形式的procedure:
--无参procedure
create or replace procedure pro_no_param
is
begin
dbms_output.put_line('the procedure without params');
end pro_no_param; --调用
--one: 无参的procedure名字后面必须要();
call pro_no_param(); --two:procedure名称后面可以没有();
begin
pro_no_param();
end;
3、参数类型为IN的procedure:
--有参procedure 只有IN类型
create or replace procedure pro_in_param(
v_1 in number,
v_2 in varchar2,
v_3 in date
)
is
begin
dbms_output.put_line('v1: ' || v_1 || ' v2: ' || v_2 || ' v2: '|| (to_char(v_3, 'yyyy-mm-dd')));
end pro_in_param; begin
pro_in_param(1, 'chy', sysdate);
end;
4、参数类型为OUT的procedure:
--有参procedure 只有OUT类型
create or replace procedure pro_out_param(
v1 out number,
v2 out char
)
is
begin
v1 := 2;
v2 := 'andyChen';
end pro_out_param; --记得声明用于存放procedure的out值的变量
--语句结束了一定记得结尾的 —— ;
declare
v_1 number;
v_2 varchar2(200);
begin
pro_out_param(v_1, v_2);
dbms_output.put_line('v1: ' || v_1 || ' v2: ' || v_2);
end;
5、参数类型同时为IN和OUT的procedure:
--同时为INOUT参数的procedure
--用同一变量接收传入的值然后将这个变量当作输出的值赋给执行时声明的变量
create or replace procedure pro_in_out_param(
in_out_param in out varchar2
)
is
begin
in_out_param := 'in_out_param and ' || in_out_param;
end pro_in_out_param; declare
in_out_param varchar2(222) := 'detail param';
begin
pro_in_out_param(in_out_param);
dbms_output.put_line(in_out_param);
end;
三:实例
CREATE TABLE user_info
(
id VARCHAR2(4) not null primary key,
name VARCHAR2(15),
pwd VARCHAR2(15),
address VARCHAR2(30)
); --创建一个添加用户的stored_procedure;
create or replace procedure pro_addUser(
n_id user_info.id%type,
n_name user_info.name%type,
n_pwd user_info.pwd%TYPE,
n_address user_info.address%TYPE
)
as
begin
--插入数据
insert into user_info(id,name,pwd,address)
values(n_id, n_name, n_pwd, n_address);
end pro_addUser; --调用、有变量需要声明的时候才有declare、没有就直接begin
begin
pro_addUser('1', 'chy', 'admin', 'nanjin');
if SQL%found then
dbms_output.put_line('add successed');
end if;
end; --根据id查询用户名和密码
create or replace procedure pro_getUserInfo(
n_id user_info.id%type,
n_name out user_info.name%type,
n_pwd out user_info.pwd%type
)
as
begin
select user_info.name, user_info.pwd into n_name, n_pwd
from user_info
where user_info.id=n_id;
end pro_getUserInfo; --调用
declare
v_id user_info.id%type := '1';
v_name user_info.name%type;
v_pwd user_info.pwd%type;
begin
pro_getUserInfo(v_id, v_name, v_pwd);
dbms_output.put_line('name: ' || v_name || ' pwd: ' || v_pwd);
end; -- 打印九九乘法表
create or replace procedure pro_multiplication_table
is
i integer;
j integer;
begin
for i in 1..9 loop
for j in 1..9 loop
if i>=j then
DBMS_output.put(To_Char(j)||'*'||to_char(i)||'='||to_char(i*j)||' ');
end if;
end loop;
DBMS_output.put_line('');
end loop;
end pro_multiplication_table; --调用
call pro_multiplication_table(); --使用自定义游标、根据工作and薪水查询员工姓名
create or replace procedure pro_getName(
n_sal emp.sal%type,
n_ename out emp.ename%type,
n_job in out emp.job%type
)
is
n_count number;
cursor cur is select ename from emp where emp.sal > n_sal and emp.job=n_job;
n_row cur%rowtype;
begin
select count(*) into n_count from emp where emp.sal > n_sal and emp.job=n_job;
if n_count > 1 then
for n_row in cur loop
DBMS_output.put_line('职工姓名为:'||n_row.ename||' 工作为:'||n_job);
end loop;
else
DBMS_output.put_line('未查到符合条件的记录!');
end if;
end pro_getName; -- 调用
declare
v_sal emp.sal%type := 2000;
v_job emp.job%type :='MANAGER';
v_ename emp.ename%type;
begin
pro_getName(v_sal, v_ename, v_job);
end; --ref cursor的使用
--创建存放弱引用和强引用的cursor的包
create or replace package refcursor_pkg
as
type weak_ref_cursor is ref cursor;
type strong_ref_cursor is ref cursor return emp%rowtype;
end refcursor_pkg; --将弱引用的cursor作为结果返回
create or replace procedure test(
p_deptno in number,
p_cursor out refcursor_pkg.weak_ref_cursor
)
is begin
open p_cursor for select * from emp where deptno=p_deptno;
end test; /**或者不用包直接使用下面这种定义
create or replace procedure test_1(
p_deptno IN number,
p_cursor OUT SYS_REFCURSOR
)
is
begin
open p_cursor FOR select *from emp where deptno = p_deptno;
end test_1;
*/ declare
v_deptno number := 20;
v_cursor refcursor_pkg.weak_ref_cursor;
r_emp emp%rowtype;
begin
test(v_deptno, v_cursor);
loop
fetch v_cursor into r_emp;
exit when v_cursor%notfound;
dbms_output.put_line('empno: ' || r_emp.empno || ' ename: ' || r_emp.ename || ' job: ' || r_emp.job);
end loop;
close v_cursor;
end;
/** //java中使用ref cursor public void method() throws SQLException{
Connection conn = getConnection();
CallableStatement cstmt = null;
ResultSet rs = null;
int deptno = 10;
Object temp;
try{
cstmt = conn.prepareCall("begin test(?,?); end;");
cstmt.setInt(1, deptno);
cstmt.registerOutParameter(2, OracleTypes.CURSOR);
cstmt.execute();
rs = (ResultSet) cstmt.getObject(2);
ResultSetMetaData rsm = rs.getMetaData();
int columnCount = rsm.getColumnCount();
while (rs.next()){
for (int j=0;j< columnCount;j++){
temp = rs.getObject(j+1);
}
}
} finally {
if (!rs==null){
rs.close();
}
if (!stmt==null){
stmt.close();
}
if (!conn==null){
conn.close();
}
}
}
*/
oracle 存储过程及REF CURSOR的使用的更多相关文章
- Oracle中遍历Ref Cursor示例
示例编写环境 数据库:Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 登陆用户:Scott O ...
- oracle中REF Cursor用法
from:http://www.111cn.net/database/Oracle/42873.htm 1,什么是 REF游标 ? 动态关联结果集的临时对象.即在运行的时候动态决定执行查询. 2,RE ...
- ORACLE中RECORD、VARRAY、TABLE、IS REF CURSOR 的使用及实例详解
ORACLE中RECORD.VARRAY.TAB.IS REF CURSOR LE的使用及实例详解 create or replaceprocedure PRO_RECORD_ROW_TAB_EXAM ...
- Oracle ref cursor和sys_refcursor
1. 自定义 ref cursor 和 sys_refcursor; 2. sys_refcursor 做为参数传递结果集; 3. ref cursor 做为参数传递结果集; 1. 自定义 ref c ...
- oracle sys_refcursor用法和ref cursor区别
--创建过程,参数为sys_refcursor,为out型 create or replace procedure aabbsys_refcursor(o out sys_refcursor) is ...
- oracle 存储过程 包 【转】
一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...
- C#中使用Oracle存储过程返回结果集
问题: 在MSSQLServer中定义的存储过程可以直接返回一个数据集,如: create procedure sp_getAllEmployees as SELECT * FROM [NORTHWN ...
- Oracle 存储过程学习
转自:http://blog.chinaunix.net/uid-20495387-id-174394.html http://www.cnblogs.com/rootq/articles/11000 ...
- (转)oracle 存储过程 带游标作为OUT参数输出
(转)oracle 存储过程 带游标作为OUT参数输出 存储过程返回OUT参数的游标 例子. 包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 ...
随机推荐
- ES6-字符串-模板字符串(复习+学习)
昨天学习了字符串对象和字符串的表示,就是利用utf-8等不同的编码方式,还有许多的对象方法,都是处理字符串的方法,挺方便的,今天我学习了一下字符串模板,这里记录i一下学习的笔记,当然,今天学习了部分内 ...
- PTA 是否二叉搜索树 (25分)
PTA 是否二叉搜索树 (25分) 本题要求实现函数,判断给定二叉树是否二叉搜索树. 函数接口定义: bool IsBST ( BinTree T ); 其中BinTree结构定义如下: typede ...
- vue项目部署到docker中
通过nginx镜像部署 vue项目npm run build打包成dist目录,有的打包会加上版本号 启动 docker 将dist目录通过xftp拷贝到linux服务器上,同目录下新建Dockerf ...
- ssh密码登录
https://stackoverflow.com/a/16928662/8025086 https://askubuntu.com/a/634789/861079 #!/usr/bin/expect ...
- 第四周PTA笔记 好吃的巧克力+特殊的翻译+下次一定(续)+走迷宫
好吃的巧克力 超市正在特价售卖巧克力,正好被贪吃的Lucky_dog看见了. 巧克力从左到右排成一排,一共有N个,M种. 超市有一个很奇怪的规定,就是你在购买巧克力时必须提供两个数字a和b,代表你要购 ...
- Python基础(dict与set)
#和list比较,dict有以下几个特点: #查找和插入的速度极快,不会随着key的增加而变慢: #需要占用大量的内存,内存浪费多. #dict1 = {'傻狗1':100,'傻狗2':200,'傻狗 ...
- Python如何格式化输出
目录 Python中的格式化输出 1.旧格式化 2.新格式format( ) 函数 Python中的格式化输出 格式化输出就是将字符串中的某些内容替换掉再输出就是格式化输出 旧格式化输出常用的有%d( ...
- SeleniumLibrary 主要关键字 基于python3
关键字的解释 https://blog.csdn.net/ak739105231/article/details/88926995 click element 都是元素点击事件:不赘述 click l ...
- oracle 连接数据库并查询,返回List<Map<String, Object>> 数据
package JDBC; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; impor ...
- [cf461D]Appleman and Complicated Task
假设该矩形是aij,那么有a(i,j)=a(i-1,j-1)^a(i-1,j+1)^a(i-2,j),不断递归下去可以发现a(i,j)=a(1,y-x+1)^a(1,y-x+3)^--^a(1,x+y ...