Oracle存储过程和函数使用方法
一.存储过程(PROCEDURE)
使用过程, 不仅可以简化客户端应用程序的开发和维护,而且可以提高应用程序的运行性能.
CREATE [OR REPLACE] PROCUDURE procedure_name
(arg1 [model1] datatype1, arg2[model2] datatype2)
IS [AS]
PL/SQL Block;
arg1,arg2用于指定过程的参数,IS/AS用于开始一个PL/SQL块.当指定参数数据类型时,不能指定其长度.
在建立过程的时间,既可以指定输入参数(IN),也可以指定输出参数(OUT)以及输入输出参数(IN OUT).如果不定义参数模式,则默认为输入参数,如果要定义输出参数,则需要指定OUT关键字,如果定义输入输出参数, 要指定IN OUT关键字. 一般使用execute(或exec) 过程名 或者 call 过程名来调用过程.
set serveroutput on打开oracle 的输出.
(1)不带参数的过程
CREATE OR REPLACE PROCEDURE out_time
IS
BEGIN
dbms_output.put_line(systimestamp);
END;
call out_time();或者 exec out_time;
(2)带IN参数的过程
如果不指定参数模式,则默认的为IN,也可以显示的指定输入模式IN.
CREATE OR REPLACE PROCEDURE add_employee
(eno NUMBER,name VARCHAR2,sal NUMBER,job VARCHAR2 DEFAULT 'CCC', dno NUMBER)
IS
BEGIN
INSERT INTO emp(empno, ename,sal,job,deptno)
VALUES(eno,ename,sal,job,dno);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
RAISE_APPLICATION_ERROR(-20000, '雇员不能重复');
END;
除了默认值的参数外,其余的都要输入.
(3)带OUT的过程
在过程中输出结果是使用OUT或者IN OUT来完成的.
定义输出参数的时间,必须要使用OUT来定义输出.
CREATE OR REPLACE PROCEDURE query_employee
(eno NUMBER,name OUT VARCHAR2,sal OUT NUMBER)
IS
BEGIN
SELECT ename, sal INTO name, sal FROM emp WHERE empno=eno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000, '雇员不存在');
END;
对于指定为OUT类型的参数,必须定义变量接收输出参数的数据.调用实例:
SQL> var name VARCHAR2(10)
SQL> var sal NUMBER
SQL> exec query_employee(77,:name,:sal)
SQL> print name sal
(4)带IN和OUT的过程
在调用前要通过变量给参数传递数据,在调用结束后,会通过此变量将值传递给应用程序
CREATE OR PROCEDURE compute
(num IN OUT NUMBER, num2 IN OUT NUMBER)
IS
v1 NUMBER;
v2 NUMBER;
BEGIN
v1:=num1/num2;
v2:=MOD(num1, num2);
num1 := v1;
num2 := v2;
END;
在应用程序调用IN OUT的存储过程时,必须提供两个变量临时存放数值,运行如下:
SQL> var n1 NUMBER
SQL> var n2 NUMBER
SQL> exec :n1:=100
SQL> exec :n2:=30
SQL> exec compute(:n1, :n2)
SQL> PRINT n1 n2
(5)为参数传递变量和数据
[1]位置传递
如 SQL> exec add_dept(50, 'SALES', 'NEW YORK')
[2]名称传递,使用=>符号来指定值
如 SQL> exec add_dept(dno=>50)
[3]组合传递,以上两种传递方法交替
(6)查看过程的源代码
过程名,源代码,执行代码放到了数据字典中,通过查询数据字典USER_SOURCE,可以显示当前用户定义的过程
SELECT text FROM user_source WHERE name='ADD_DEPT';
(7)删除过程
DROP PROCEDURE 过程名
二.函数 (FUNCTION)
CREATE [OR REPLACE] FUNCTION function_name
(arg1 [model1] datatype1,arg2 [model2] datatype2)
RETURN datatype
IS|AS
PL/SQL Block;
arg1,arg2指定函数 的参数,当不指定参数数据类型时,不能指定其长度
RETURN 指定函数 返回的数据类型.注意,函数 前面必须要有RETURN子句.在函数 体内至少含有一条RETURN子句.函数 的参数MODEl和过程的一样
(1)不带参数的函数
CREATE OR REPLACE FUNCTION get_user
RETURN VARCHAR2
IS
v_user VARCHAR2(100);
BEGIN
SELECT username INTO v_user FROM user_users;
RETURN v_user;
END;
调用方法
SQL> var v1 VARCHAR2(100)
SQL> exec :v1:=get_user
SQL> PRINT v1
(2)带IN参数
CREATE OR REPLACE FUNCTION get_sal(name IN VARCHAR2)
RETURN NUMBER
IS
v_sal emp.sal%TYPE;
BEGIN
SELECT sal INTO v_sal FROM emp
WHERE upper(ename)=upper(name);
RETURN v_sal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise-application_error(-20000,'该雇员不存在');
END;
调用方法如下:
SQL> var sal NUMBER
SQL> exec :sal:=get_sal('scott')
SQL> print sal
(3)带OUT参数
一般情况下,函数 只需要单个返回数据,如果希望使用函数 同事返回多个数据,就需要用到输出参数了.
CREATE OR REPLACR FUNCTION get_info
(name VARCHAR2, title OUT VARCHAR2)
RETURN VARCHAR2
AS
deptname dept.dname%TYPE;
BEGIN
SELECT a.job,b.dname INTO title, deptname
FROM emp a, dept b
WHERE a.deptno = b.deptno
AND upper(a.ename) = upper(a.ename)
RETURN deptname;
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise_application_erro(-20000, '雇员不存在');
END;
由于此函数 带有OUT参数,所以要定义变量接收OUT参数和函数 的返回值
SQL> var job varchar2(20)
SQL> var dname varchar2920)
SQL> exec :dname:=getinfo('scott',:job)
SQL> print dname job
(4)带IN OUT参数
在调用函数 之前需要通过变量给该种参数传递数据
CREATE OR REPLACE FUNCTION result
(num1 NUMBER, num2 IN OUT NUMBER)
RETURN NUMBER
AS
v_result NUMBER(6);
v_remain NUMBER;
BEGIN
v_result:=num1/num2;
v_remain:=MOD(num1, num2);
num2 := v_remain;
RETURN v_result;
EXCEPTION
WHEN ZERO_DIVIDE THEN
raise_application_error(-20000, '不能除0');
END;
执行如下:
SQL> var result1 NUMBER
SQL> var result2 NUMBER
SQL> exec :result2:=30
SQL> exec :result1:=result(100, :result2)
SQL> print result1 result2
(5)函数 的删除
DROP FUNCTION 函数 名
三.子程序的管理
列出当前用户的子程序
数据字典视图USER_OBJECTS显示当前用户所包含的所有对象.可以列出用户的表,视图,索引,也可以列出用户的过程,函数 等.
SELECT object_name, created, status FROM user_object2 WHERE object_type IN ('PROCEDURE', 'FUNCTION');
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JHHJA/archive/2010/12/07/6060486.aspx
Oracle存储过程和函数使用方法的更多相关文章
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
- Oracle调用Java类开发的存储过程、函数的方法
oracle调用java类的基本步骤 1. 编写java代码,后续可以直接使用java代码,class文件或者jar包 2. 将写好的java代码导入到oracle数据库中,有两种方法:一种是使用lo ...
- oracle 存储过程,存储函数,包,
http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...
- Oracle存储过程、函数、包加密wrap
wrap加密可以将PL/SQL的代码实现部分隐藏,提高代码的安全性,如存储过程.函数.包等都隐藏. wrap加密的方法有两种,下面以函数为例分别介绍一下: 方法一: 编写好函数后保存到 d:\test ...
- oracle 存储过程,函数和包
创建存储过程: 语法:create [or replace] PROCEDURE 过程名(参数列表) AS PLSQL子程序体: 调用 存储过程的方式 两种1.execute(exec) - ...
- JAVA调用Oracle存储过程和函数
连接数据库的工具类: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; imp ...
- Oracle————存储过程与函数
存储过程存储过程参数模式包括IN.OUT. IN OUT. IN(默认参数模式):表示当存储过程别调用时,实参值被传递给形参:形参起变量作用,只能读该参数,而不能修改该参数.IN模式参数可以是变量或表 ...
- Oracle存储过程及函数的练习题
--存储过程.函数练习题 --(1)创建一个存储过程,以员工号为参数,输出该员工的工资create or replace procedure p_sxt1(v_empno in emp.empno%t ...
- Oracle存储过程及函数
1.在Oracle中,存储过程包括三部分组成:定义部分.执行部分.和异常处理部分(即例外) eg1:输入员工编号,查询员工的姓名和薪资 create or repalce procedure myp ...
随机推荐
- mongodb远程连接配置
mongodb远程连接配置如下: 1.修改配置文件mongodb.conf 命令:vim /etc/mongodb.conf 把 bind_ip=127.0.0.1 这一行注释掉或者是修改成 bind ...
- KBEngine简单RPG-Demo源码解析(1)
一:环境搭建1. 确保已经下载过KBEngine服务端引擎,如果没有下载请先下载 下载服务端源码(KBEngine): https://github.com ...
- django-将数据库数据转换成JSON格式(ORM和SQL两种情况)
最近打算搞一个自动化运维平台,所以在看Django的知识. 在实际项目开发中,遇到一个小问题:前后端发生数据交互主流采用的是JSON.前端传数据到服务器端比较简单,稍微麻烦的是服务器端传JSON到前端 ...
- Educational Codeforces Round 22.B 暴力
B. The Golden Age time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- SpringMvc多视图配置(jsp、velocity、freemarker) 在src目录views.properties配置
#welcome为modelAndView.setViewName(" welcome " ) ; 中的welcome .(class)固定写法 welcome.(class)=o ...
- WPF制作带明细的环形图标
效果 明细用Popup实现的,录gif时,Popup显示不出来,不知道为什么,所以静态图凑合看吧 大体思路 图表使用Arc+Popup实现 图表分为两部分,一是环形部分,一是标注的明细部分. 环形部分 ...
- 支持苹果IPV6 ONLY 的socket 修改方法
首先别错误理解以为app 必须支持 ipv6 的服务端, 只需要支持 ipv6的客户端需要访问 ipv4 的服务端. 目前需要经过 NAT64 转换就能达到目的,客户端只需要支持该转换就能实现, 在 ...
- git - 远程分支
对于用户来说,git给人提交到本地的机会.我们可以在自己的机器上创建不同的branch,来测试和存放不同的代码. 对于代码管理员而言,git有许多优良的特性.管理着不同的分支,同一套源代码可以出不一样 ...
- 通过添加filter过滤器 彻底解决ajax 跨域问题
1.在web.xml添加filter <filter> <filter-name>contextfilter</filter-name> <filter-cl ...
- 学习笔记TF027:卷积神经网络
卷积神经网络(Convolutional Neural Network,CNN),可以解决图像识别.时间序列信息问题.深度学习之前,借助SIFT.HoG等算法提取特征,集合SVM等机器学习算法识别图像 ...