`
javaTo
  • 浏览: 24129 次
  • 性别: Icon_minigender_1
  • 来自: 飘着
社区版块
存档分类
最新评论

Oracle 开发 - 5

阅读更多
--[5]// Oracle Procedure and Function
-------------------------------------------------------------------------------------//
--过程(PROCEDURE)--------------------------------------------------//
--创建表
CREATE TABLE user_info
(
	id   VARCHAR2(4),
	name VARCHAR2(15),
	pwd  VARCHAR2(15),
	address VARCHAR2(30)
);
--插入数据
INSERT INTO user_info VALUES('u001','zhao','zhao','shanghai');

--如要经常执行插入,Oracle每次都要进行编译,并判断语法正确性,因此执行速度可想而知,
--所以我们要创建一个过程来实现
CREATE OR REPLACE PROCEDURE AddNewUser
(
	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 AddNewUser;
/
--下面我们利用PL/SQL匿名块调用该过程
DECLARE
	--描述新用户的变量
	v_id   user_info.id%TYPE   := 'u002';
	v_name user_info.name%TYPE := 'wish';
	v_pwd  user_info.pwd%TYPE  := 'history';
	v_add  user_info.address%TYPE := 'shanghai';
BEGIN
	--调用过程,添加wish用户到数据库
	AddNewUser(v_id,v_name,v_pwd,v_add);
	DBMS_OUTPUT.PUT_LINE('用户 ' || v_name || ' 已经成功插入');
END;
/
--或者可以利用EXEC()直接插入
EXEC AddNewUser('u003','jian','jian','beijing');
--或
EXECUTE AddNewUser('u004','zhang','zhang','beijing');

--在这种上下文中,调用过程中的变量就类似于(C、VB)中的实参,而过程里的变量就是形参
--形参的模式(IN、OUT、IN OUT),默认为IN
--IN     :只读属性,即不能修改
--Out    :读写属性,即可读可写
--In Out :顾名思义,他是 IN 和 OUT 的集合
--下面通过一个示例来理解
CREATE OR REPLACE PROCEDURE ModeSimple
(
	p_InParameter    IN NUMBER,
	p_OutParameter   OUT NUMBER,
	p_InOutParameter IN OUT NUMBER
)
IS
v_LocalVariable NUMBER := 0;
BEGIN
	DBMS_OUTPUT.PUT_LINE('过程前:');
	IF (p_InParameter IS NULL) THEN
		DBMS_OUTPUT.PUT_LINE('p_InParameter is NULL');
	ELSE
		DBMS_OUTPUT.PUT_LINE('p_InParameter = ' || p_InParameter);
	END IF;
	IF (p_OutParameter IS NULL) THEN
		DBMS_OUTPUT.PUT_LINE('p_OutParameter is NULL');
	ELSE
		DBMS_OUTPUT.PUT_LINE('p_OutParameter = ' || p_OutParameter);
	END IF;
	IF (p_InOutParameter IS NULL) THEN
		DBMS_OUTPUT.PUT_LINE('p_InOutParameter is NULL');
	ELSE
		DBMS_OUTPUT.PUT_LINE('p_InOutParameter = ' || p_InOutParameter);
	END IF;
	
	--赋值
	v_LocalVariable := p_InParameter;    --合法
	v_LocalVariable := p_OutParameter;   --合法,注:必须Oracle 9i或以上版本
	v_LocalVariable := p_InOutParameter; --合法
	--!p_Inparameter := 7;  --非法,因为 IN 参数不能被修改
	p_OutParameter   := 7;  --合法
	p_InOutParameter := 8;  --合法
	
	DBMS_OUTPUT.PUT_LINE('过程末:');
	IF (p_InParameter IS NULL) THEN
		DBMS_OUTPUT.PUT_LINE('p_InParameter is NULL');
	ELSE
		DBMS_OUTPUT.PUT_LINE('p_InParameter = ' || p_InParameter);
	END IF;
	IF (p_OutParameter IS NULL) THEN
		DBMS_OUTPUT.PUT_LINE('p_OutParameter is NULL');
	ELSE
		DBMS_OUTPUT.PUT_LINE('p_OutParameter = ' || p_OutParameter);
	END IF;
	IF (p_InOutParameter IS NULL) THEN
		DBMS_OUTPUT.PUT_LINE('p_InOutParameter is NULL');
	ELSE
		DBMS_OUTPUT.PUT_LINE('p_InOutParameter = ' || p_InOutParameter);
	END IF;
END ModeSimple;
/
--利用PL/SQL匿名块调用过程来查看结果
DECLARE
	v_in  NUMBER   := 1;
	v_out NUMBER   := 2;
	v_inout NUMBER := 3;
BEGIN
	DBMS_OUTPUT.PUT_LINE('在调用过程前:');
	DBMS_OUTPUT.PUT_LINE('v_In = ' || v_in);
	DBMS_OUTPUT.PUT_LINE('v_Out = ' || v_out);
	DBMS_OUTPUT.PUT_LINE('v_InOut = ' || v_inout);
	--调用过程 ModeSimple
	ModeSimple(v_in,v_out,v_inout);
	DBMS_OUTPUT.PUT_LINE('在调用过程后:');
	DBMS_OUTPUT.PUT_LINE('v_In = ' || v_in);
	DBMS_OUTPUT.PUT_LINE('v_Out = ' || v_out);
	DBMS_OUTPUT.PUT_LINE('v_InOut = ' || v_inout);
END;
/

--与过程相关的数据字典(这里的条件必须大写)
SELECT object_name,object_type,status FROM user_objects
	WHERE object_name = 'MODESIMPLE';


--函数(Function)---------------------------------------------------//
--函数与过程结构上相似,不同的是函数有一条RETURN语句,用来返回值
--例如我们要查询用户zhao是否在user_info中存在
CREATE OR REPLACE FUNCTION CheckUser
(
	f_user user_info.name%TYPE
)
RETURN BOOLEAN  --函数返回类型
IS
v_userCount NUMBER;
BEGIN
	SELECT COUNT(name) INTO v_userCount FROM user_info WHERE name = f_user;
	IF (v_userCount > 0) THEN
		RETURN TRUE;
	ELSE
		RETURN FALSE;
	END IF;
END CheckUser;
/
--下面我们可以这样调用该函数
DECLARE
	user user_info.name%TYPE := 'jian';
	a    BOOLEAN;
BEGIN
	IF CheckUser(user) THEN
		DBMS_OUTPUT.PUT_LINE('用户 ' || user || ' 存在');
	ELSE
		DBMS_OUTPUT.PUT_LINE('用户 ' || user || ' 不存在');
	END IF;
END;
/


--附注:------------------------------------------------------------//
/* 过程与函数的差别
  函数与过程有很多相似的地方,但也有一些差别,其中的一点就是,过程的参数可以有三种模式(IN、OUT、
  IN OUT),而函数只有一种(IN),因为使用函数的目的是传入0或多个参数,返回单一的值,想让函数返回多
  个值是一种不良的编程习惯,我们应该加以改正。
*/

/* 注意
  以上程序均未做任何错误处理(有关异常处理,请参见前面章节),但作为一种编程习惯,我们要对编写的
  程序负责,即出现异常就要处理,或在其他相应的代码中进行。
*/
----------------------------------------------------------------------------------End//
分享到:
评论

相关推荐

    Oracle专用Linux操作系统-OracleLinux-R6-U5-Server-x86_64

    Oracle Linux R6 U5 (Update 5) 是该操作系统的第六个主要版本的第五次更新,提供了对x86_64架构的支持。这个操作系统的关键特性包括对性能的优化,特别是对于运行Oracle软件的服务器,以及与Red Hat Enterprise ...

    oracleasm-support-2.1.8-1.el5.i386

    这个名为"oracleasm-support-2.1.8-1.el5.i386.rpm"的软件包是针对Oracle ASM在32位的Red Hat Enterprise Linux 5 (RHEL5)系统上的版本。它的主要功能包括提供内核模块、工具和其他必要的组件,使得ASM能够在该平台...

    oracle-xe-11.2.0-1.0.x86_64.rpm.zip

    5. **免费:** 对于个人和开发用途,Oracle XE 是完全免费的。 安装 Oracle XE 11.2.0 的步骤通常包括: 1. 确保系统满足最低硬件要求并支持 RPM。 2. 解压 "oracle-xe-11.2.0-1.0.x86_64.rpm.zip",获取 "oracle-...

    oracle-support oracleasmlib kmod-oracleasm包

    Oracle ASM 是Oracle公司开发的一种集成的存储管理解决方案,它为Oracle数据库提供了自动化的磁盘管理和故障恢复功能。ASM能够简化存储配置,通过自动化的方式创建、扩展和管理磁盘组,同时提供高可用性和性能优化。...

    安装oracle11gR2数据库环境快速准备神器oracle-rdbms-server-11gR2-preinstall

    1. **自动安装所需RPM包**:Oracle数据库运行需要一系列特定的RPM包,包括开发库、管理工具等。oracle-rdbms-server-11gR2-preinstall会自动识别并安装这些必要的软件包,确保数据库能够正常运行。 2. **创建Oracle...

    oracle-database-server-12cR2-preinstall

    5. **环境变量**:设置与Oracle数据库安装和运行相关的环境变量,如ORACLE_HOME、PATH、LD_LIBRARY_PATH等。 6. **初始化脚本**:包含启动、停止、重启数据库的初始化脚本,简化数据库服务的管理。 7. **Oracle ...

    OracleClient-18C Oracle客户端,包括windows和Linux

    对于开发人员来说,OracleClient-18C提供了ODBC和JDBC驱动程序,使Java、C++、Python等语言的应用程序能够连接到Oracle数据库。同时,它还支持ODPI-C,这是一个开源的C接口,用于构建高性能的Oracle数据库连接器。 ...

    包装物流管理软件:Oracle二次开发-OraclePL-SQL编程技术

    包装物流管理软件:Oracle二次开发_OraclePL-SQL编程技术.docx 包装物流管理软件:Oracle二次开发_Oracle包装物流管理软件二次开发基础.docx 包装物流管理软件:Oracle二次开发_Oracle数据库体系结构与管理.docx ...

    oracleclient-basic-windows.x64-11.2.rar

    5. 验证安装,可以通过编写简单的ODBC连接测试程序或使用SQL*Plus来检查是否能成功连接到Oracle数据库。 对于开发人员来说,理解如何配置和使用Oracle 11g ODBC客户端至关重要,因为这直接影响到他们能否顺利地在...

    tableau10.0-oracle-driver-x64.msi

    tableau10.0-oracle-driver-x64.msi,tableau开发oracle必须包

    oracle X5-2 产品手册-中文

    - **快速供应测试环境和开发环境**: 使用数据库和VM快照技术加速开发周期。 - **单一供应商提供支持**: 所有硬件和软件组件均由Oracle统一支持,简化了技术支持流程。 综上所述,Oracle数据库机X5-2通过其强大的...

    OracleEBS-应用开发培训.pptx

    OracleEBS-应用开发培训

    ORACLE 8-8I开发使用手册

    Oracle 8-8i是Oracle数据库的一个早期版本,它在...通过深入学习和实践这个“ORACLE 8-8I开发使用手册”,开发者和DBA将能够有效地管理和优化这些早期版本的Oracle数据库,同时也能为理解现代Oracle版本打下坚实基础。

    OracleClient-21C Oracle客户端,包括windows和Linux

    OracleClient-21C是Oracle公司推出的最新版数据库客户端,主要为用户提供与Oracle数据库服务器进行交互的工具和接口。这个版本适用于Windows和Linux操作系统,确保了跨平台的兼容性和灵活性,满足不同用户环境的需求...

    oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm

    1)rpm格式包安装配置 1.1 下载以rpm后缀名的包,以11.2.0.4.0 版本为例...oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm --包含头文件和示例文件,为开发Oracle应用程序的即时客户端; 1.2 使用rpm -ivh

    oracle-SpringBoot Oracle示例-Samples.zip

    这个压缩包很可能包含了一系列Java代码、配置文件和其他必要的资源,用于演示如何在实际开发环境中设置和操作Oracle数据库。 描述中的"oracle_SpringBoot Oracle示例_Samples"进一步确认了这个压缩包的内容,它是一...

    OracleEBS-报表开发工具

    ### OracleEBS-报表开发工具知识点详解 #### 一、Oracle Report Builder **1.1 概述** Oracle Report Builder 是 Oracle 最初推出的报表开发工具之一。即使在 R12 版本中,它仍然是创建打印凭证等报表的首选工具。...

    oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm

    oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm --包含头文件和示例文件,为开发Oracle应用程序的即时客户端; 1.2 使用rpm -ivh [包名] 进行安装, 如:rpm -ivh oracle-instantclient11.2-basic-11.2....

    OracleClient-19C Oracle客户端,包括windows和Linux

    1. **oci.dll/oci.so**:Oracle Call Interface (OCI) 是Oracle数据库的编程接口,允许开发人员用C或C++编写应用程序来与数据库交互。 2. **tnsnames.ora**:这是一个配置文件,定义了数据库的连接描述符(TNS,...

    oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm

    Oracle Instant Client是Oracle公司提供的一款轻量级的数据库连接工具,用于在Linux系统上与Oracle数据库进行通信...它可以用于开发、测试和监控数据库,而无需完整安装Oracle数据库服务器,从而降低了系统资源的占用。

Global site tag (gtag.js) - Google Analytics