基本使用方法及示例

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的使用的更多相关文章

  1. Oracle中遍历Ref Cursor示例

    示例编写环境 数据库:Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 登陆用户:Scott O ...

  2. oracle中REF Cursor用法

    from:http://www.111cn.net/database/Oracle/42873.htm 1,什么是 REF游标 ? 动态关联结果集的临时对象.即在运行的时候动态决定执行查询. 2,RE ...

  3. ORACLE中RECORD、VARRAY、TABLE、IS REF CURSOR 的使用及实例详解

    ORACLE中RECORD.VARRAY.TAB.IS REF CURSOR LE的使用及实例详解 create or replaceprocedure PRO_RECORD_ROW_TAB_EXAM ...

  4. Oracle ref cursor和sys_refcursor

    1. 自定义 ref cursor 和 sys_refcursor; 2. sys_refcursor 做为参数传递结果集; 3. ref cursor 做为参数传递结果集; 1. 自定义 ref c ...

  5. oracle sys_refcursor用法和ref cursor区别

    --创建过程,参数为sys_refcursor,为out型 create or replace procedure aabbsys_refcursor(o out sys_refcursor) is ...

  6. oracle 存储过程 包 【转】

    一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...

  7. C#中使用Oracle存储过程返回结果集

    问题: 在MSSQLServer中定义的存储过程可以直接返回一个数据集,如: create procedure sp_getAllEmployees as SELECT * FROM [NORTHWN ...

  8. Oracle 存储过程学习

    转自:http://blog.chinaunix.net/uid-20495387-id-174394.html http://www.cnblogs.com/rootq/articles/11000 ...

  9. (转)oracle 存储过程 带游标作为OUT参数输出

    (转)oracle 存储过程 带游标作为OUT参数输出 存储过程返回OUT参数的游标 例子. 包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 ...

随机推荐

  1. JMeter学习笔记--并发登录测试

    账号密码读取文件 1.设置线程数为30,并发用户量就是30个用户同时登录 2.添加同步定时器 添加 Synchronizing Timer 同步定时器,为了阻塞线程,当线程数达到指定数量,再同时释放, ...

  2. PTA 哈利·波特的考试 (25分)

    PTA 哈利·波特的考试 (25分) 哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等.反方向变 ...

  3. jenkins项目发布

    目录 一.简介 二.docker打包 一.后端打包 二.前端打包 三.启动容器 四.完整代码 五.发布测试 六.优化方案 七.源码地址: 八.参考 一.简介 1.该章节基于jenkins.Harbor ...

  4. C# 合并两个数组总结

    byte[] b1 = new byte[] { 1, 2, 3, 4, 5 }; byte[] b2 = new byte[] { 6, 7, 8, 9 }; byte[] b3 = new byt ...

  5. [第二章]c++学习笔记1(类和对象的基础2)

    类的成员函数可和类的定义分开写 类成员的可访问范围(private,public,protected) 具体使用方法 使用例

  6. 要web开发精品教程吗?免费无广告一百期连讲的那种-逐浪CMS前端开发100期入门教程全面开放

    要web开发精品教程吗?免费无广告一百期连讲的那种-逐浪CMS前端开发100期入门教程全面开放 大师主讲 经验难得 由逐浪CMS首席架构师发哥老师,亲自主理讲解. 历时一年精心打造, 汇聚了互联网诞生 ...

  7. java-TCP协议发送和接收数据

    TCP协议接收数据的步骤: A:创建接收数据的Socket对象 创建对象的时候要指定端口 B:监听客户端连接 等待客户端连接 C:获取Socket对象的输入流(字节流) D:读数据,并显示在控制台 E ...

  8. vivo统一告警平台设计与实践

    一.背景 一套监控系统检测和告警是密不可分的,检测用来发现异常,告警用来将问题信息发送给相应的人.vivo监控系统1.0时代各个监控系统分别维护一套计算.存储.检测.告警收敛逻辑,这种架构下对底层数据 ...

  9. [loj2478]林克卡特树

    原题等价于选择恰好$k+1$条不相交(无公共点)的路径使得边权和最大 证明:对于原题中的最优解,一定包含了k条0边权的边(否则可以将未使用的边删掉,然后将这条路径的末尾与不在同一个连通块内的点连边), ...

  10. Nginx大厂面试需要掌握多少v1.21.3

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Nginx官网 最新版本为1.21.3 Nginx (engine x) 是一个开源的.高性能的HTTP和反向代理web服务 ...