参考资料: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自定义函数和存储过程示例,自定义函数与存储过程区别的更多相关文章

  1. Oracle存储过程和自定义函数

    新博客文章链接,欢迎大家评论探讨 概述 存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 异同点: 存储过程和存储函数的相同点:完成特定功能的程序. 存储过程和存储 ...

  2. Oracle存储过程和自定义函数笔记

    学习地址:https://www.imooc.com/learn/370 存储过程和存储函数定义:指存储在数据库中供所有用户程序调用的子程序叫做存储过程 .存储函数. 相同点:完成特定功能的程序.区别 ...

  3. MySQL存储过程/存储过程与自定义函数的区别

    语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ...

  4. (转)MySQL存储过程/存储过程与自定义函数的区别

    转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE [definer = {user|current_user}]  ...

  5. 【存储过程】MySQL存储过程/存储过程与自定义函数的区别

    ---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer = {user|current_user ...

  6. MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别

    1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...

  7. SQL中存储过程和自定义函数的区别

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  8. SQL中存储过程和自定义函数的区别(转载)

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  9. java mysql自定义函数UDF之调用c函数

    正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. goo ...

  10. 存储过程,存储函数(Oracle)

    存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 存储过程和存储函数的区别? 存储函数:可以通过return 语句返回函数值. 存储过程:不能 除此之外我们可以认为 ...

随机推荐

  1. Informatica 常用组件Source Qualifier之七 使用排序端口

    使用已排序端口时,PowerCenter 将添加端口至默认查询中的 ORDER BY 子句.PowerCenter Server 将添加配置的端口号,从源限定符转换的顶部开始.在映射中包括以下任何转换 ...

  2. UVA 10474 (13.08.04)

     Where is the Marble?  Raju and Meena love to play with Marbles. They have got a lotof marbles with ...

  3. RequireJS 参考文章

    入门: http://www.cnblogs.com/snandy/archive/2012/05/22/2513652.html http://www.cnblogs.com/snandy/arch ...

  4. 反射 Reflect Modifier 修饰符工具类

    在查看反射相关的Class.Field .Constructor 等类时,看到他们都有这样一个方法:getModifiers():返回此类或接口以整数编码的 Java 语言修饰符.如需要知道返回的值所 ...

  5. 【转】gcc选项

    http://zodiac1111.github.io/blog/config-gcc-warning/

  6. 体绘制(Volume Rendering)概述之3:光线投射算法(Ray Casting)原理和注意要点(强烈推荐呀,讲的很好)

    转自:http://blog.csdn.net/liu_lin_xm/article/details/4850609 摘抄“GPU Programming And Cg Language Primer ...

  7. 初探 hexo博客

    近期两天迷上了hexo和gitcafe.最终搭建好了自己的个人主页.以后也能够用那个来写博客啦~直接用的gitcafe的二级域名和server,(gitcafe的server在国外.速度也挺快的),h ...

  8. Foreda8上安装Ant1.9.2

    Ant在Win上安装很简单,解压拷贝+设置Ant_Home,在Linux上差不多也是这两步. 首先下载apache-ant-1.9.2-bin.tar.gz. 然后解压tar xvzf apache- ...

  9. 在 Ubuntu 12.04 上通过源码安装 Open vSwitch (OVS)

    安装 Ubuntu 12.04, 而且更新系统 apt-getupdate; apt-getupgrade; 安装所需的package apt-get install automake autocon ...

  10. 漫谈单点登录(SSO)(淘宝天猫)(转载)

    1. 摘要 ( 注意:请仔细看下摘要,留心此文是否是您的菜,若浪费宝贵时间,深感歉意!!!) SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂,各式各样应有尽有!开 ...