基本使用方法及示例

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. Linux常用命令和快捷键整理:(1)常用命令

    前言: Linux常用快捷键和基本命令整理,先上思维导图: 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限) ...

  2. hudi clustering 数据聚集(二)

    小文件合并解析 执行代码: import org.apache.hudi.QuickstartUtils._ import scala.collection.JavaConversions._ imp ...

  3. 一个反直觉的sql

    引子 在<容易引起雪崩的两个处理>里,我提到一个慢查询的问题.本文先从整洁架构的角度讲讲慢查询sql完成的功能以及设计,再介绍对sql进行的实施测试现象以及思考. 设计讲解 一见杨过误终身 ...

  4. selet 语句详解

    SELECT 语句的基本格式为:        SELECT 要查询的列名 FROM 表名字 WHERE 限制条件;        2.0 数学符号条件            SELECT 语句常常会 ...

  5. ES6--ES12笔记整理(1)

    一.let const 五个共同特点 不允许重复声明 块级作用域 不存在变量提升 不影响作用域链 暂时性死区---在代码块内,使用let/const命令声明变量之前,该变量都是不可用的.这在语法上,称 ...

  6. [cf1379F]Chess Strikes Back

    考虑将$(2i-1,2j-1)$和$(2i,2j)$缩为一个点,记作$(i,j)$ 对于每一个点,只能选$(2i-1,2j-1)$或$(2i,2j)$(显然不能都选),而这样恰好为$nm$个,因此必须 ...

  7. Python学习手册——第二部分 类型和运算(1)之字符串

    Python全景 1.程序由模块构成. 2.模块包含语句. 3.语句包含表达式. 4.表达式建立并处理对象. 在python中数据是以对象的形式出现的!!! 为什么使用内置类型 内置对象使程序更容易编 ...

  8. asList和subList的缺陷

    概述 在开发中我们经常使用asList去把一个数组转换为List.也存在通过subList.subMap.来对List.Map.Set来进行类似使用subString方法来对String对象进行分割处 ...

  9. 快速入门上手Markdown

    第一次接触Markdown是写代码初期看很多大佬的github,他们的项目一定会有一份文件叫Readme.md的文件 他们由一些简单美观的符号和汉字字母组成,编译之后成为一篇简单直观的文档 深入了解之 ...

  10. Codeforces 516E - Drazil and His Happy Friends(同余最短路)

    Codeforces 题面传送门 & 洛谷题面传送门 首先思考一个非常简单的性质:记 \(d=\gcd(n,m)\),那么每次在一起吃完饭的男女孩编号必定与 \(d\) 同余,而根据斐蜀定理可 ...