`

转 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');
分享到:
评论

相关推荐

    Oracle存储过程和函数(最详细包含emp 表实例操作,边看边操作)

    通过学习和实践这些Oracle存储过程和函数的实例,你可以更好地理解和掌握如何在实际项目中应用它们。Oracle 存储过程详解.doc文档可能包含了更多详细的步骤和示例,建议详细阅读,以深化对这一主题的理解。

    java调用oracle存储过程或者函数

    以下将详细介绍这个过程,包括必要的步骤、使用的类和方法,以及可能遇到的问题和解决方案。 一、环境准备 1. Oracle数据库:确保已安装并配置了Oracle数据库,存储过程或函数已经在数据库中创建并可用。 2. JDBC...

    Oracle存储过程、函数和包

    ### Oracle存储过程、函数和包的关键知识点 #### 1. 存储过程和函数的认识 - **定义**:存储过程和函数是特定类型的PL/SQL块,它们被存储在数据库中,作为命名的对象存在。 - **命名存储**:与普通的PL/SQL块不同,...

    oracle 存储过程 函数 dblink

    本文主要介绍了Oracle存储过程的概念、创建和调用方法,以及如何使用DBLink实现跨库操作。存储过程提供了强大的数据库处理能力,而DBLink则使得不同数据库实例之间的交互变得更加方便和高效。掌握这些技术对于提高...

    oracle存储过程和函数PPT

    在Oracle数据库开发中,存储过程和函数以及PL/SQL语言是至关重要的组成部分。这篇内容将深入解析这些核心概念。 首先,我们来谈谈“存储过程”。存储过程是一组预编译的SQL语句,可以在数据库中保存并重复调用,以...

    ORACLE存储过程,函数,包,游标

    在《ORACLE存储过程,函数,包,游标》这个文本文件中,可能包含了关于如何定义、调用和管理这些对象的示例代码和实践指导。通过阅读和理解这个文件,开发者能够深入了解Oracle数据库的动态编程能力,提升其在数据库...

    oracle存储过程函数生成DEMO

    综上所述,"Oracle存储过程函数生成DEMO"涵盖了Oracle数据库中关于存储过程和函数的基本概念、创建方法、调用方式以及可能涉及到的数据操作。通过学习和实践这个DEMO,开发者可以更好地理解和掌握如何在实际项目中...

    Oracle存储过程、游标、函数的详解

    通过以上对Oracle存储过程、游标和函数的详细介绍,我们可以看到这些特性为Oracle数据库提供了一种强大而灵活的方式来处理数据。掌握这些技术对于开发高效的应用程序至关重要。在未来的学习和实践中,我们应该不断...

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...

    oracle存储过程和函数写法

    oracle 的存储过程和函数的语法 如下

    java中调用oracle的存储过程和函数

    ### Java中调用Oracle的存储过程和函数 在Java应用程序中调用Oracle数据库中的存储过程或函数是一项常见的任务。这不仅能够提高代码的执行效率,还可以有效地管理事务处理,确保数据的一致性和完整性。本文将详细...

    JAVA 与ORACLE 存储过程及函数

    在“JAVA与存储过程.txt”文件中,可能包含了具体的示例代码,解释了如何在Java中调用Oracle存储过程和函数,以及如何处理输入和输出参数。这些示例可能涉及到了`Connection`, `PreparedStatement`, `ResultSet`等...

    Oracle编程存储过程、函数和包

    讲解了oracle的编程存储过程、函数和包

    oracle函数调用存储过程

    在开发Oracle应用程序时,经常需要使用到存储过程和函数。这两种类型的数据库对象各有优势,可以满足不同的业务需求。有时候,为了更好地组织代码和提高复用性,我们可能会考虑在函数内部调用一个存储过程。这种做法...

    hibernate query调用oracle存储过程

    以下是一个简单的示例,展示了如何调用一个不带参数的Oracle存储过程: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); session....

    oracle笔记存储函数和存储过程

    oracle笔记存储函数和存储过程,有具体的代码案例!存储函数和存储过程的知识笔记!

    oracle存储过程_函数_语法_大全_详解

    本文将详细介绍Oracle存储过程与函数的创建、使用方法以及常见操作。 #### 二、创建存储过程 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。存储过程的优点包括提高性能、减少网络流量、...

    oracle数据库 存储过程和函数的使用

    根据给定文件的信息,我们可以详细地探讨Oracle数据库中存储过程和函数的相关知识点。 ### 存储过程的意义 存储过程是一种数据库对象,它是由SQL语句和流程控制语句组成的预编译模块,存储在数据库服务器上。存储...

    oracle记录存储过程日志的方法

    本包用于记录存储过程里面的日志,将日志信息写入日志表(mylog)。可以记录日志时间、过程名称、过程里面记录日志的行数、参数值。如果在异常处理部分记录日志,还可以记录异常代码、异常...本人使用开发环境为oracle10g

    oracle函数大全及存储过程语法.rar

    本资源"oracle函数大全及存储过程语法.rar"显然是一个关于Oracle函数和存储过程的详细指南,涵盖了各种常用和高级的函数以及存储过程的编写和使用方法。 一、Oracle函数 Oracle提供了丰富的内置函数,包括数值函数...

Global site tag (gtag.js) - Google Analytics