Oracle中定义package以及存储过程的使用

使用scott账户下的dept表;

select * from dept order by deptno;

10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS

30 SALES CHICAGO

40 OPERATIONS BOSTON

为了演示方便,插入一条数据:

insert into dept(deptno, dname, loc) values(50,‘SYSTEM‘, ‘NEW YORK‘);

新插入的记录为:50 SYSTEM NEW YORK

我们主要演示在package中存储过程的返回类型为pipelined,cursor 和 value三种。

1.返回类型为pipelined。  

create or REPLACE type dept_obj is OBJECT( DEPTNO NUMBER(2,0), DNAME VARCHAR2(14 BYTE) );

create or REPLACE type dept_obj_type AS table of dept_obj;

2.定义package 和package body。

 1 create or replace package SPTest
 2 is
 3 /*return a pipelined demo start*/
 4 type dept_data_rec_type is RECORD(
 5   DEPTNO NUMBER(2,0),
 6      DNAME VARCHAR2(14)
 7 );
 8
 9 type dept_ref_type is REF CURSOR;
10
11 function getDept(in_loc IN VARCHAR2) return dept_obj_type pipelined;
12 /*return a pipelined demo end*/
13
14 /*return a cursor demo start*/
15 FUNCTION getDeptInfo(in_deptno IN dept.deptno%TYPE) RETURN dept_ref_type;
16 /*return a cursor demo end*/
17
18 /* return a varchar value start */
19 function getName(in_deptno in number) RETURN VARCHAR2;
20 /* return a varchar value end */
21 end SPTest;
22 /
23 -----------------------------------------------------------------------------------------------
24 create or replace package body SPTest
25 is
26   /*return a pipelined demo start*/
27   function getDept(in_loc IN VARCHAR2) return dept_obj_type pipelined is
28     l_dept_obj dept_obj :=dept_obj(null, null);
29     dept_ref_type_cursor dept_ref_type;
30     dept_data_rec        dept_data_rec_type;
31   begin
32     open dept_ref_type_cursor
33     for select deptno, dname from dept where loc = in_loc;
34
35     loop
36     fetch dept_ref_type_cursor into dept_data_rec;
37     exit when dept_ref_type_cursor%NOTFOUND;
38     l_dept_obj.DEPTNO := dept_data_rec.DEPTNO;
39     l_dept_obj.DNAME := dept_data_rec.DNAME;
40
41     pipe row(l_dept_obj);
42     end loop;
43     close dept_ref_type_cursor;
44     RETURN ;
45   end getDept;
46   /*return a pipelined demo end*/
47
48   /*return a cursor demo start*/
49   FUNCTION getDeptInfo(in_deptno IN dept.deptno%TYPE) RETURN dept_ref_type
50   AS
51           dept_ref_type_cursor dept_ref_type;
52      BEGIN
53
54      OPEN dept_ref_type_cursor FOR
55           SELECT deptno, dname, loc FROM dept where deptno = in_deptno;
56
57      RETURN dept_ref_type_cursor;
58
59      END getDeptInfo;
60   /*return a cursor demo end*/
61
62   /* return a varchar value start */
63   function getName(in_deptno in number) RETURN VARCHAR2
64   as rtn_deptname VARCHAR2(100);
65   begin
66     select dname into rtn_deptname from dept where deptno = in_deptno;
67     RETURN rtn_deptname;
68   end getName;
69   /* return a varchar value start */
70
71 end SPTest;
72 /

最后,执行存储过程。

/*返回pipelined table */

select deptno, dname from table(SPTest.getDept(‘NEW YORK‘)) order by deptno;

/*返回cursor*/

select SPTest.getDeptInfo(10) from dual;

/*返回具体值*/

select SPTest.getName(50) from dual;

时间: 2024-12-05 04:14:23

Oracle中定义package以及存储过程的使用的相关文章

oracle中job定时调用存储过程的实例

使用job模拟定时从元数据表中抽取指定数据进入目标表的过程. 一.创建元数据表 --create table test_origianl create table test_original_data( id number(10,2) primary key, name varchar2(200), descCont varchar2(100), dateType char(5) ); 二.元数据表中插入数据 insert into test_original_data values(2.9,'

查看ORACLE中正在运行的存储过程 kill

1:登陆PLSQL Developer,写一个存储过程,向一个表中插入值,并运行存储过程 2:打开PLSQL Developer的命令窗口 .--终止procedure   11.select * from v$access a where object like 'SETEMUSERCONTEXT%' 注意:SETEMUSERCONTEXT存储过程名称大写 12.select * from v$session where sid in(135,157) 查询sid的session 13.alt

oracle中函数和存储过程的区别和联系【转载竹沥半夏】

oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别. 一.存储过程 1.定义 存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procedure. 2.创建存储过程 create [or replace] procedure 存储过程名 [(参数1 类型,参数2 out 类型……)] as

oracle中函数和存储过程的区别和联系

oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别. 一.存储过程 1.定义 存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procedure. 2.创建存储过程 create [or replace] procedure 存储过程名 [(参数1 类型,参数2 out 类型……)] as 变量名 类型:

oracle中的创建过程,函数,包

一.创建存储过程 存储过程是在oracle中存取完成特定业务逻辑的代码块.存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次.命名块可以多次使用. 创建存储过程的语法: create [or replace] procedure 存储过程的名称(参数名[in/out/inout] 参数类型,参数名...)] is/as 变量声明部分 begin 业务逻辑处理部分 exception 异常处理部分 end; 注意: 1.存储过

关于oracle中数据类型的选择

由于是初学,犯了如下错误: 生成表的主键id时,用当前时间的毫秒值.而在oracle中定义主键id时,用的数据类型是char(32).在mybatis中通过id取数据怎么也取不出来.想了好几天,本来以为是浏览器中取id是带有空值,于是乎就用trim()函数去除空值,但还是没有查出数据,最后才发现是数据库中的数据类型定义成固定长度了,当前时间的毫秒值只有16位,而char(32)就是固定长度的32位,意思也就是说有16位是空格了,所有没法取出数据.动手将char(32)改成varchar2(32)

Oracle 中包(Package)

一.什么要使用包?        在一个大型项目中,可能有很多模块,而每个模块又有自己的过程.函数等.而这些过程.函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起 的,即Procedures中),这些非常不方便查询和维护,甚至会发生误删除的事件. PL/SQL为了满足程序模块化的需要,引入了包的构造.通过使用包就可以分类管理过程和函数等. (1)包是一种数据库对象,相当于一个容器.将逻辑上相关的过程.函数.变量.常量和游标组合成一个更大的单位.用户可以从其他 PL/SQL 块中对其

用sql语句导出oracle中的存储过程和函数

用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' replace SELECT CASE WHEN LINE = 1 THEN 'CREATE OR REPLACE ' || TEXT WHEN LINE = MAX_LINE THEN TEXT || CHR(10 ) || '/' ELSE TEXT END FROM USER_SOURCE A LEF

Oracle中的存储过程

 pl/sql编程语言是Oracle中操作数据库最快的语言,而存储过程本质就是pl/sql,所以通过存储过程来对数据库进行CRUD是最有效的. 不再使用JDBC来进行CRUD操作,因为使用JDBC来进行CRUD操作效率低. 所以,Java通过调用存储过程,来间接调用pl/sql,达到对数据库的CRUD操作. 我们可以把CRUD操作封装到存储过程中,在程序中,调用存储过程即可. 以下是例子:来自于Oracle讲师赵强 --打印Hello World /* 调用存储过程 1. exec sayH