- 浏览: 84252 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
guji528:
可以这样监控某Oracle用户已执行的sql:
--TEST用 ...
v$sql,v$sqlarea,v$sqltext区别 -
xiaoliu216:
印象深刻。。。
爱情守则
一、程序包的相关知识
1.定义与说明
a. 相关对象的封装
b. 程序包的各部分
- 程序包规格说明
声明子程序
- 程序包主体
定义子程序
2.使用程序包的优点
- 模块化
- 更轻松的应用程序设计
- 信息隐藏
- 新增功能
- 性能更佳
3.公有项和私有项的区别
公有项:在程序包说明部分定义的变量、过程、函数
私有项:在程序包主体部分定义的变量、过程、函数
公有项 私有项
可以在程序包之外引用 不能在程序包之外引用
是在程序包规格说明中定义的 是在程序包主体中定义的
用于全局目的 用于局部目的
二、程序包创建说明
1.程序包规格说明
(1)、使用Create Package命令进行创建
(2)、包含公用对象和类型
(3)、声明类型、常量、变量、异常、游标和子程序
(4)、可以在没有程序包主题的情况下存在
(5)、可以重载
- 程序包中的多个子程序可以具有相同的名称
- 它们的形参是不同的
- 只能位于打包的子程序中
- 限制
a. 如果子程序的参数仅名称或模式不同,则不能重载
b. 不能基于其返回类型重载子程序
2.程序包主体
(1)、使用Create Package body 命令进行创建
(2)、包含子程序和游标的定义
(3)、包含私有声明
(4)、不能在没有程序包规格说明的情况下独立存在
3.程序包的调用
包名.类型名;
包名.函数名[参数表];
包名..过程名[参数表];
(1)、 Package-name.type-name
(2)、 Package-name.object-name
(3)、 Package-name.subprogram-name
其中,Package-name 是程序包名称,type-name是类型名称,
object-name是对象名称,subprogram-name 是子程序名称
--示例
DBMS_output.put_line(Hello);
(4)、对于返回参数是游标类型的调用(如:引用游标)
set autoprint on --打开Sqlplus输出
variable tempCur RefCursor; --定义一个宿主类型的引用游标变量
exec StudentPackage.ReturnStudent(:tempCur); --执行带有引用游标的过程 注意使用宿主类型的变量前面要加“:”符号
4. 有关子程序和程序包的信息
A.数据字典
User_objects 用于检查对象是否存在
User_source 用于获取对象的代码
B. 包的修改和删除
Alter Package [Body] 包名
Alter Package Body StudentPackage;
Drop Package [Body] 包名
Drop Package Body StudentPackage;
5. 创建格式
A.创建包规格部分
格式:Create [or replace] Package 包名
IS|AS
变量声明;
类型定义;
异常声明;
游标声明;
函数说明;
过程说明;
Pragma restrict_references(过程名或函数名,WNDS[,WNPS][,RNDS][,RNPS]) --编译指令 限定函数的操作
End [包名];
B.创建包主体部分
格式: Create [or replace] package body 包主体名 --包主体名一定要是已经定义的包名
IS|AS
变量声明; --具体的实现部分
类型定义;
异常声明;
游标声明;
函数说明;
过程定义;
End [包主体名];
6. 示例
示例1.创建程序包的规格说明部分
Create or replace Package StudentPackage
is
Type curRefStudent is Ref Cursor Return Student%rowtype;
Procedure SelectStudent(FindID in Student.stuid%type);
Procedure InsertStudent(NewStudent in Student%rowType);
Procedure UpdateStudent(NewStudent in Student%rowType);
Procedure DeleteStudent(DelID in Student.stuid%type);
Procedure ReturnStudent(inOutstu in out curRefStudent);
Function RegurnRecordCount Return Number;
End studentPackage;
示例2.创建程序包的主体部分
Create or replace Package Body StudentPackage IS
Procedure SelectStudent(FindID in Student.stuid%type) as --注意没有Create
/*实现查询过程的定义*/
Cursor findCur is select * from student where stuid=FindID;
Begin
For S in FindCur Loop
DBMS_output.put_line(S.stuID||' '||s.StuName||' '||S.Sex);
End Loop;
Exception
When No_Data_Found Then
DBMS_output.Put_Line('没有查到ID为'||FindID||'的记录!');
When Others Then
DBMS_output.Put_Line('查询过程中发生意外情况');
End SelectStudent; --结束查询过程
/*实现插入过程的定义*/
Procedure InsertStudent(NewStudent in Student%rowType) as
iRec Integer;
Not_Exists_Student Exception; --预定义异常
Begin
Select count(*) into iRec from student where stuid=NewStudent.stuID;
IF iRec>0 Then
Raise Not_Exists_Student;
Else
insert into student values(NewStudent.stuid,NewStudent.stuName,NewStudent.sex);
commit;
End IF;
Exception
When Not_Exists_Student Then
DBMS_output.Put_Line('要插入的编号:'||NewStudent.stuid||'的记录已经存在');
When Others Then
DBMS_output.Put_Line('插入记录操作过程中出现错误');
End InsertStudent;--结束插入过程
/*实现更新过程的定义*/
Procedure UpdateStudent(NewStudent in Student%rowType) as
iRec Integer;
Begin
select Count(*) into iRec From student Where stuid=NewStudent.stuid;
IF iRec =0 Then
DBMS_output.Put_Line('编号为:'||NewStudent.stuid||'的记录不存在,修改失败');
ELSE
Update student Set Stuname=NewStudent.stuName,Sex=NewStudent.Sex
WHERE stuid=NewStudent.stuID;
Commit;
End IF;
Exception
When No_Data_Found Then
DBMS_output.Put_Line('编号为:'||NewStudent.stuID||'的记录不存在,修改失败');
When Others Then
DBMS_output.Put_Line('执行修改操作时发生意外情况,修改未成功');
End UpdateStudent;--结束修改过程
/*实现删除过程的定义*/
Procedure DeleteStudent(DelID in Student.stuid%type) as
iRec Integer;
Begin
Select Count(*) into iRec From Student Where stuID=DelID;
IF iRec=0 Then
DBMS_output.Put_Line('编号为:'||DelID||'的记录不存在,删除操作时未成功');
ELSE
Delete From student Where stuid=DelID;
Commit;
DBMS_output.Put_Line('删除成功!');
End IF;
Exception
When Others Then
DBMS_output.Put_Line('执行删除操作时发生意外情况,删除未成功');
End DeleteStudent;
/*实现参数带有游标类型定义*/
Procedure ReturnStudent(inOutstu in out curRefStudent) as
Begin
Open inOutstu For Select * from student;
End ReturnStudent;
/*实现函数定义*/
Function RegurnRecordCount Return Number as
RecCount number(10);
Begin
Select Count(*) into RecCount From student;
Return recCount;
Exception
When Others Then
DBMS_output.Put_Line('查询表中记录数时发生意外情况');
End RegurnRecordCount; --结束函数的定义
End studentPackage;--结束包
示例3:调用包
1. 调用studentPackage包中的InsertStudent过程
Declare
newStu Student%RowType;
Begin
newStu.stuID:='1001';
newStu.stuName:='张三';
newStu.sex:='男';
studentPackage.InsertStudent(newStu);
End;
/
2. 调用studentPackage包中的UpdateStudent过程
Declare
newStu Student%RowType;
Begin
newStu.stuID:='1001';
newStu.stuName:='李四';
newStu.sex:='女';
studentPackage.UpdateStudent(newStu);
Exception
When Dup_Val_On_Index Then
DBMS_output.Put_Line('唯一约束被破坏');
When Others Then
DBMS_output.Put_Line('更新过程出现错误');
End;
/
3. 调用studentPackage包中的DeleteStudent过程
Begin
studentPackage.DeleteStudent('1001');
End;
/
4. 调用studentPackage包中的ReturnRecordCount函数
Begin
DBMS_output.put_Line(studentPackage.ReturnRecordCount);
End;
/
1.定义与说明
a. 相关对象的封装
b. 程序包的各部分
- 程序包规格说明
声明子程序
- 程序包主体
定义子程序
2.使用程序包的优点
- 模块化
- 更轻松的应用程序设计
- 信息隐藏
- 新增功能
- 性能更佳
3.公有项和私有项的区别
公有项:在程序包说明部分定义的变量、过程、函数
私有项:在程序包主体部分定义的变量、过程、函数
公有项 私有项
可以在程序包之外引用 不能在程序包之外引用
是在程序包规格说明中定义的 是在程序包主体中定义的
用于全局目的 用于局部目的
二、程序包创建说明
1.程序包规格说明
(1)、使用Create Package命令进行创建
(2)、包含公用对象和类型
(3)、声明类型、常量、变量、异常、游标和子程序
(4)、可以在没有程序包主题的情况下存在
(5)、可以重载
- 程序包中的多个子程序可以具有相同的名称
- 它们的形参是不同的
- 只能位于打包的子程序中
- 限制
a. 如果子程序的参数仅名称或模式不同,则不能重载
b. 不能基于其返回类型重载子程序
2.程序包主体
(1)、使用Create Package body 命令进行创建
(2)、包含子程序和游标的定义
(3)、包含私有声明
(4)、不能在没有程序包规格说明的情况下独立存在
3.程序包的调用
包名.类型名;
包名.函数名[参数表];
包名..过程名[参数表];
(1)、 Package-name.type-name
(2)、 Package-name.object-name
(3)、 Package-name.subprogram-name
其中,Package-name 是程序包名称,type-name是类型名称,
object-name是对象名称,subprogram-name 是子程序名称
--示例
DBMS_output.put_line(Hello);
(4)、对于返回参数是游标类型的调用(如:引用游标)
set autoprint on --打开Sqlplus输出
variable tempCur RefCursor; --定义一个宿主类型的引用游标变量
exec StudentPackage.ReturnStudent(:tempCur); --执行带有引用游标的过程 注意使用宿主类型的变量前面要加“:”符号
4. 有关子程序和程序包的信息
A.数据字典
User_objects 用于检查对象是否存在
User_source 用于获取对象的代码
B. 包的修改和删除
Alter Package [Body] 包名
Alter Package Body StudentPackage;
Drop Package [Body] 包名
Drop Package Body StudentPackage;
5. 创建格式
A.创建包规格部分
格式:Create [or replace] Package 包名
IS|AS
变量声明;
类型定义;
异常声明;
游标声明;
函数说明;
过程说明;
Pragma restrict_references(过程名或函数名,WNDS[,WNPS][,RNDS][,RNPS]) --编译指令 限定函数的操作
End [包名];
B.创建包主体部分
格式: Create [or replace] package body 包主体名 --包主体名一定要是已经定义的包名
IS|AS
变量声明; --具体的实现部分
类型定义;
异常声明;
游标声明;
函数说明;
过程定义;
End [包主体名];
6. 示例
示例1.创建程序包的规格说明部分
Create or replace Package StudentPackage
is
Type curRefStudent is Ref Cursor Return Student%rowtype;
Procedure SelectStudent(FindID in Student.stuid%type);
Procedure InsertStudent(NewStudent in Student%rowType);
Procedure UpdateStudent(NewStudent in Student%rowType);
Procedure DeleteStudent(DelID in Student.stuid%type);
Procedure ReturnStudent(inOutstu in out curRefStudent);
Function RegurnRecordCount Return Number;
End studentPackage;
示例2.创建程序包的主体部分
Create or replace Package Body StudentPackage IS
Procedure SelectStudent(FindID in Student.stuid%type) as --注意没有Create
/*实现查询过程的定义*/
Cursor findCur is select * from student where stuid=FindID;
Begin
For S in FindCur Loop
DBMS_output.put_line(S.stuID||' '||s.StuName||' '||S.Sex);
End Loop;
Exception
When No_Data_Found Then
DBMS_output.Put_Line('没有查到ID为'||FindID||'的记录!');
When Others Then
DBMS_output.Put_Line('查询过程中发生意外情况');
End SelectStudent; --结束查询过程
/*实现插入过程的定义*/
Procedure InsertStudent(NewStudent in Student%rowType) as
iRec Integer;
Not_Exists_Student Exception; --预定义异常
Begin
Select count(*) into iRec from student where stuid=NewStudent.stuID;
IF iRec>0 Then
Raise Not_Exists_Student;
Else
insert into student values(NewStudent.stuid,NewStudent.stuName,NewStudent.sex);
commit;
End IF;
Exception
When Not_Exists_Student Then
DBMS_output.Put_Line('要插入的编号:'||NewStudent.stuid||'的记录已经存在');
When Others Then
DBMS_output.Put_Line('插入记录操作过程中出现错误');
End InsertStudent;--结束插入过程
/*实现更新过程的定义*/
Procedure UpdateStudent(NewStudent in Student%rowType) as
iRec Integer;
Begin
select Count(*) into iRec From student Where stuid=NewStudent.stuid;
IF iRec =0 Then
DBMS_output.Put_Line('编号为:'||NewStudent.stuid||'的记录不存在,修改失败');
ELSE
Update student Set Stuname=NewStudent.stuName,Sex=NewStudent.Sex
WHERE stuid=NewStudent.stuID;
Commit;
End IF;
Exception
When No_Data_Found Then
DBMS_output.Put_Line('编号为:'||NewStudent.stuID||'的记录不存在,修改失败');
When Others Then
DBMS_output.Put_Line('执行修改操作时发生意外情况,修改未成功');
End UpdateStudent;--结束修改过程
/*实现删除过程的定义*/
Procedure DeleteStudent(DelID in Student.stuid%type) as
iRec Integer;
Begin
Select Count(*) into iRec From Student Where stuID=DelID;
IF iRec=0 Then
DBMS_output.Put_Line('编号为:'||DelID||'的记录不存在,删除操作时未成功');
ELSE
Delete From student Where stuid=DelID;
Commit;
DBMS_output.Put_Line('删除成功!');
End IF;
Exception
When Others Then
DBMS_output.Put_Line('执行删除操作时发生意外情况,删除未成功');
End DeleteStudent;
/*实现参数带有游标类型定义*/
Procedure ReturnStudent(inOutstu in out curRefStudent) as
Begin
Open inOutstu For Select * from student;
End ReturnStudent;
/*实现函数定义*/
Function RegurnRecordCount Return Number as
RecCount number(10);
Begin
Select Count(*) into RecCount From student;
Return recCount;
Exception
When Others Then
DBMS_output.Put_Line('查询表中记录数时发生意外情况');
End RegurnRecordCount; --结束函数的定义
End studentPackage;--结束包
示例3:调用包
1. 调用studentPackage包中的InsertStudent过程
Declare
newStu Student%RowType;
Begin
newStu.stuID:='1001';
newStu.stuName:='张三';
newStu.sex:='男';
studentPackage.InsertStudent(newStu);
End;
/
2. 调用studentPackage包中的UpdateStudent过程
Declare
newStu Student%RowType;
Begin
newStu.stuID:='1001';
newStu.stuName:='李四';
newStu.sex:='女';
studentPackage.UpdateStudent(newStu);
Exception
When Dup_Val_On_Index Then
DBMS_output.Put_Line('唯一约束被破坏');
When Others Then
DBMS_output.Put_Line('更新过程出现错误');
End;
/
3. 调用studentPackage包中的DeleteStudent过程
Begin
studentPackage.DeleteStudent('1001');
End;
/
4. 调用studentPackage包中的ReturnRecordCount函数
Begin
DBMS_output.put_Line(studentPackage.ReturnRecordCount);
End;
/
发表评论
-
Hp unix中问题解决方案讲解
2010-08-13 18:29 1062当我们经常操作Hp unix的时候,就会遇到在操作系统上rm掉 ... -
HP-UX下删除文件无法释放空间
2010-08-13 18:28 24891 引言 很多人会遇到在操作系统上rm掉一个大的文件,以解决 ... -
v$sql,v$sqlarea,v$sqltext区别
2009-12-17 13:11 3064v$sqltext 存储的是完整的SQL,SQL被分割 SQ ... -
oracle SYS_CONTEXT列表
2009-10-16 10:27 939select SYS_CONTEXT('USERENV', ... -
Oracle CONNECT BY 循环 错误
2009-10-10 23:16 1610java.sql.SQLException: ORA-0143 ... -
Oracle创建索引要做到三个适当
2009-09-28 11:59 2382在Oracle数据库中,创建 ... -
分布式oracle中databaselink
2009-09-21 20:31 1151数据库链接定义从一个Oracle数据库到另一个数据库的单行通信 ... -
oracle:java stored procedure or function
2009-09-20 14:35 1136--java source hasn't return val ... -
Procedure to kill a session
2009-09-07 22:31 1004On the Oracle-L mailing list a ... -
oracle 动态SQL
2009-09-06 19:47 747sql_update := 'update ' || tabl ... -
1.Oracle游标大全;2.分析Oracle日志文件
2009-07-17 16:28 13031.Oracle游标大全 SELECT语句用于从数据库 ... -
PI 实时数据库系统
2009-07-17 10:21 2319PI 实时数据库系统(Plant Information Sy ... -
rlwrap使用方法
2008-12-04 15:45 1125在Windows操作系统上,当在DOS命令窗口中运行SQL*P ... -
recovery
2008-09-27 15:31 704Understanding the types of fail ... -
backup
2008-09-27 15:30 758The control files contain the m ... -
Database Maintenance
2008-09-24 16:11 771Oracle 10g provides many tools ... -
Assigning a Profile to a User
2008-09-19 15:04 924A profile serves two purposes: ... -
Sizing the Large Pool
2008-09-19 09:35 707select sum(value) "Max MTS ... -
Oracle Net manages
2008-09-18 12:06 1062Oracle Net manages the flow of ... -
Heterogeneous Services
2008-09-16 12:12 785Heterogeneous Services provide ...
相关推荐
oracle权限管理 GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX, CREATE SEQUENCE, CREATE TYPE TO YZHQ WITH ADMIN OPTION; 收回 REVOKE CREATE SESSION, CREATE TABLE, CREATE VIEW, ...
Create or Replace Package UTL_FTP AUTHID CURRENT_USER as Type Connection is Record( Connection UTL_TCP.Connection, AccountInfo VarChar2(1000), TransferMethod Char(1), --A: ASCII...
E:\app\oracle\admin\mydb\create E:\app\oracle\oradata\mydb 3、创建初始化参数文件:(特权模式) create pfile from spfile; mydb.__db_cache_size=348127232 mydb.__java_pool_size=12582912 mydb.__...
package com.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DB { private static Connection conn; private static String url="jdbc:oracle...
oracle汉字转化拼音 CREATE OR REPLACE package GetHZPY is -- Author : ADMINISTRATOR -- Created : 2006-10-8 上午 11:51:16 -- Purpose : 获得汉字拼音编码
oracle_PLSQL_语法详细手册 目 录 第一部分 SQL语法部分 3 一、 CREATE TABLE 语句 3 二、 CREATE SEQUENCE语句 5 三、 CREATE VIEW语句 6 四、 INSERT语句: 7 五、 UPDATE语句: 9 六、 DELETE语句: 10 七、 ...
Oracle SQL执行计划分析器功能的创建3步曲: 1 首先,编译XYG_ALD_SESS_PKG的Package头。 (XYG_ALD_SESS_PKG.sql) 2 接着要建立好下面的4个视图对象。因为XYG_ALD_SESS_PKG包体会用到。(View Create Script v...
Create or Replace Package UTL_ZIP AUTHID CURRENT_USER as Type File_List is Table of Clob; --文件变成流 Function f_File2Blob( as_SubDir in VarChar2, as_FileName in VarChar2 )Return ...
第一部分 Oracle SQL*PLUS基础 23 第一章 Oracle数据库基础 23 §1.1 理解关系数据库系统(RDBMS) 23 §1.1.1 关系模型 23 §1.1.2 Codd十二法则 24 §1.2 关系数据库系统(RDBMS)的组成 24 §1.2.1 RDBMS 内核 24...
Oracle分页存储过程的思路于sqlserver的思路是一样的,但是我这里做了点改动,在因为Oracle的语法和规则的不同所以,Oracle... 代码如下: create or replace package DotNet is — Author : good_hy — Created : 200
Which two statements are true about Oracle synonyms? A.A synonym can be created on an object in a package B.A synonym can have a synonym C.Any user can create a PUBLIC synonym D.A synonym has an ...
‘your user_dump_dest‘, ‘read‘) create a wrapper package for utl_file pk_utl_file.sql As TFMADMIN set up the tables, views and sequence tfmadmin_objects.sql create the controlling package pack_...
在Oracle里,视图不像存储过程和函数一样,可以定义输入参数,但我们...create or replace package p_view_param is --参数一 function set_param(num number) return number; function get_param return number;
实际上是利用REF CURSOR 代码如下: –procedure返回记录集: ———————-声明一个Package————– CREATE OR REPLACE PACKAGE pkg_test AS TYPEmyrctypeIS REF CURSOR; PROCEDURE get_r(p_id NUMBER,p_rc OUT ...
二,dbms_job package 用法介绍 包含以下子过程: Broken()过程。 change()过程。 Interval()过程。 Isubmit()过程。 Next_Date()过程。 Remove()过程。 Run()过程。 Submit()过程...
首先要停止数据库, 将这个表所在的表空间的文件拷贝出来, 因为Oracle在Truncate只时将相应Segment的第一个块格式化掉了, 而后面的都还存在, 到下次用时到才真正地重新格式化. 下面来讲一个Truncate表后进行恢复的...
还有一种情况,当我们使用create or replace procedure/function等语句修改Procedure和Function的时候,会话也会hang住,这是为什么呢? 当出现上述情况的时候,我们可以通过v$session_wait查询等待事件,当然,...
(1)Create Table 表名 27 (2)在原来已有表上建一个新表(结构和数据) 27 (3)使用OEM建表 27 3.默认值和NULL值 27 三. 修改表 28 四. 删除表 28 五. 数据完整性 28 1.Primary Key 约束 28 2.NOT NULL约束 ...
其实 Oracle数据库的分页还是比较容易理解的。此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一...create or replace package pagingPackage as type paging_cursor is ref cursor; end pagingPa
Chapter 1, PL/SQL Packages describes how and when you should create packages and explains why PL/SQL developers should learn to center their entire development process around packages Chapter 2, Best...