Oracle自定义函数和存储过程示例,自定义函数与存储过程区别
参考资料:http://www.newbooks.com.cn/info/60861.html
oracle自定义函数学习和连接运算符(||)
贴一段中文文档示例,应该就可以开始工作了:
--过程(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或多个参数,返回单一的值,想让函数返回多
个值是一种不良的编程习惯,我们应该加以改正。
Oracle自定义函数和存储过程示例,自定义函数与存储过程区别的更多相关文章
- Oracle存储过程和自定义函数
新博客文章链接,欢迎大家评论探讨 概述 存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 异同点: 存储过程和存储函数的相同点:完成特定功能的程序. 存储过程和存储 ...
- Oracle存储过程和自定义函数笔记
学习地址:https://www.imooc.com/learn/370 存储过程和存储函数定义:指存储在数据库中供所有用户程序调用的子程序叫做存储过程 .存储函数. 相同点:完成特定功能的程序.区别 ...
- MySQL存储过程/存储过程与自定义函数的区别
语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ...
- (转)MySQL存储过程/存储过程与自定义函数的区别
转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE [definer = {user|current_user}] ...
- 【存储过程】MySQL存储过程/存储过程与自定义函数的区别
---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer = {user|current_user ...
- MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别
1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...
- SQL中存储过程和自定义函数的区别
存储过程: 存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...
- SQL中存储过程和自定义函数的区别(转载)
存储过程: 存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...
- java mysql自定义函数UDF之调用c函数
正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. goo ...
- 存储过程,存储函数(Oracle)
存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 存储过程和存储函数的区别? 存储函数:可以通过return 语句返回函数值. 存储过程:不能 除此之外我们可以认为 ...
随机推荐
- centos6.8安装具有ngx_cache_purge模块的nginx1.10.3
CentOS-6.8 安装 Nginx1.10.3Nginx 环境准备:安装Nginx需要完成以下依赖的安装 1.gcc 安装:yum install gcc-c++ 2.PCRE pcre-deve ...
- 【IUML】支持向量机SVM[续]
支持向量机基本上是最好的有监督学习算法了.看很多正统的讲法都是从VC 维理论和结构风险最小原理出发,然后引出SVM什么的,还有些资料上来就讲分类超平面什么的.我们logistic回归出发,引出了SVM ...
- 第九章 LinkedBlockingQueue源码解析
1.对于LinkedBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2.创建 Node节点内部类与LinkedBlockingQueue的一些属性 static ...
- idea unicode自动转码设置
idea unicode自动转码设置 File > Settings > Editor > File Encodings 右侧 Properties Files 中 选中 Trans ...
- [Backbone] Parse not formatted JSON code
The good Dr. recently had another team implement the server and they slightly messed up the format o ...
- listView下拉刷新加载数据
这个下拉效果在网上最早的例子恐怕就是Johan Nilsson的实现,http://johannilsson.com/2011/03/13/android-pull-to-refresh-update ...
- 【转】TCP/IP详解学习笔记(二)
TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节 1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据 ...
- 【JavaScript】实现复选框的全选、全部不选、反选
以较为简洁的程序实现复选框的全选.全部不选.反选 操作. 并且将可变的部分设置为JS的参数,以实现代码复用. 全选和全不选 第一个参数为复选框名称,第二个参数为是全选还是全部不选. function ...
- cd命令(转)
原文地址:http://www.cnblogs.com/peida/archive/2012/10/24/2736501.html Linux cd 命令可以说是Linux中最基本的命令语句,其他的命 ...
- 3DMax脚本插件--改动材质&贴图名称
从网上淘到了一套人物的模型,当时的心情是激动无比,掏出用的不熟练的3DMax折腾了半天.突然发现了一个蛋疼的事儿,所有的模型文件,材质名称,子材质,以及贴图所实用的是中文命名!! ! 尽管说是能跑,只 ...