参考资料: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. EasyUI Pagination 分页的两种做法

    EasyUI 的 datagrid 支持服务器端分页,但是官方的资料比较少,以下总结了两种 datagrid 的服务器端分页机制,可根据情况具体使用. 一:使用 datagrid 默认机制 后台: p ...

  2. Spark从HDFS上读取JSON数据

    代码如下: import org.apache.spark.sql.Row; import org.apache.spark.SparkConf; import org.apache.spark.ap ...

  3. [leetcode]Binary Tree Maximum Path Sum @ Python

    原题地址:https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ 题意: Given a binary tree, find th ...

  4. SCSI contrller的几种类型的区别

    在VMware vSphere Web Client中, 可以为虚拟机添加一个新的SCSI controller, 选项中包含如下的类型, 那么他们有什么区别呢? 如何选择呢?   BusLogic ...

  5. Gradle for Android 翻译 -1

    英文版电子书下载 参考:Gradle for Android  一.从 Gradle 和 AS 开始 [Getting Started with Gradle and Android Studio] ...

  6. mybatis结果的组装(springboot)

    文主要解答一个问题,即如果bean没有setter,而且属性不是public的,mybatis的自动组装是否可以赋值成功的问题. 查询调用过程 DefaultSqlSession.selectList ...

  7. 【pyhon】理想论坛爬虫1.08

    #------------------------------------------------------------------------------------ # 理想论坛爬虫1.08,用 ...

  8. POSIX 线程 – pthread_sigmask

    http://www.cnblogs.com/qq78292959/archive/2012/04/05/2432985.html 概念 按照 POSIX, 异步 (外部) 信号发送到整个进程. 所有 ...

  9. IDEA开发web程序配置Tomcat

    1.下载zip版的Tomcat 7,并解压2.在IDEA中配置Tomcat 7 在idea中的Settings(Ctrl+Alt+s)(或者点击图标 ) 弹出窗口左上过滤栏中输入“Applicatio ...

  10. Linux中-POSIX 线程详解

    一种支持内存共享的简捷工具   摘自https://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/ 线程是有趣的 了解如何正确运用线 ...