`
tangqi609567707
  • 浏览: 34636 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Oracle存储过程及参数理解

阅读更多

原文地址:http://blog.sina.com.cn/s/blog_45daee4a0100n9ar.html

一、过程 (存储过程)
    过程是一个能执行某个特定操作的子程序。使用CREATE OR REPLACE创建或者替换保存在数据库中的一个子程序。

示例1:声明存储过程,该过程返回dept表行数
DECLARE
  PROCEDURE getDeptCount
  AS
    deptCount INT;
  BEGIN
    SELECT COUNT(*) INTO deptCount FROM DEPT;
    DBMS_OUTPUT.PUT_LINE('DEPT表的共有记录数:'||deptCount);
  END
getDeptCount;
BEGIN
  getDeptCount[()];
END;
注意:此存储过程
getDeptCount只在块运行时有效。

示例2:创建不带参数的存储过程,该过程返回dept表行数
CREATE OR REPLACE PROCEDURE getDeptCount
AS | IS
deptCount int;
BEGIN
  SELECT COUNT(*) INTO deptCount FROM dept;
  DBMS_OUTPUT.PUT_LINE('dept表共有'||deptCount||'行记录');
END [getDeptCount];
    当我们创建的存储过程没有参数时,在存储过程名字后面不能有括号。在AS或者IS后至BEGIN之前是声明部分,存储过程中的声明不使用DECLARE关键字。同匿名PL/SQL块一样,EXCEPTION和声明部分都是可选的。
    当我们创建的过程带有错误时,我们可以通过SELECT * FROM USER_ERRORS查看,或者使用SHOW ERRORS [ PROCEDURE Proc_Name]查看。
    使用以下代码可以执行存储过程:
BEGIN
    getDeptCount;
END;
    以上存储过程还可以通过以下代码来简化调用:
EXEC getDeptCount[;]   
CALL 
getDeptCount();
注意:

  • 并不是所有的存储过程都可以用这种方式来调用
  • 定义无参存储过程时,存储过程名后不能加()
  • 在块中或是通过EXEC调用存储过程时可以省略()
  • 通过CALL调用无参存储过程必须加上()


示例3:创建带有输入参数的存储过程,该过程通过员工编号打印工资额
CREATE OR REPLACE PROCEDURE getSalaryByEmpNo(eNo NUMBER)  --参数的数据类型不能指定长度
AS
salary emp.sal%TYPE;
BEGIN
  SELECT SAL INTO salary  FROM EMP WHERE EMPNO=eNo;
  DBMS_OUTPUT.PUT_LINE(eNo||'号员工的工资为'||salary);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
END;
    当定义的存储过程含有参数时,参数的数据类型不能指定长度。参数还有输入和输出之分,本例中没有指定,默认情况为输入参数,也可显示的指定某个参数是输入参数,如(eNo IN NUMBER)。同示例1不同,该例中加入了异常处理。同示例1类似可以使用下面的两种方式调用存储过程:
BEGIN
  getSalaryByEmpNo(7788);
END;
或者
EXEC getSalaryByEmpNo(7788);  或者
CALL getSalaryByEmpNo(7788);
但是如果传给一个存储过程的参数是变量时,必须使用BEGIN  END块,如下:
DECLARE
no emp.empNo%TYPE;
BEGIN
   no:=7788;
   getSalaryByEmpNo(no);
END;
如果某个包中含有常量,也可以通过如下的方式调用:
EXEC getSalaryByEmpNo(ConstantPackage.no);
但这种方式不能再使用CALL调用。

示例4:创建含有输入和输出参数的存储过程,该过程通过员工编号查找工资额,工资额以输出参数返回
 CREATE OR REPLACE PROCEDURE getSalaryByEmpNo(eNo IN NUMBER,salary OUT NUMBER)
 AS
 BEGIN
   SELECT SAL INTO salary  FROM EMP WHERE EMPNO=eNo;
 EXCEPTION
   WHEN NO_DATA_FOUND THEN
     DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
 END;
当过程中含有输出参数时,调用时必须通过BEGIN  END块,不能通过EXEC或CALL调用。如:
DECLARE
salary NUMBER(7,2);
BEGIN
  getSalaryByEmpNo(7788,salary);
  DBMS_OUTPUT.PUT_LINE(salary);
END;

示例5:创建参数类型既是输入参数也是输出参数的过程
CREATE OR REPLACE PROCEDURE getSalaryByEmpNo(noSalary IN OUT NUMBER)
 AS
 BEGIN
   SELECT SAL INTO noSalary  FROM EMP WHERE EMPNO=noSalary;
 EXCEPTION
   WHEN NO_DATA_FOUND THEN
     DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
 END;
调用如下:
DECLARE
no NUMBER(7,2);
BEGIN
  no:=7788;
   getSalaryByEmpNo(no);
   DBMS_OUTPUT.PUT_LINE(no);
END;

示例6:创建带有默认值的过程
CREATE OR REPLACE PROCEDURE addEmp
(
  empNo NUMBER,
  eName VARCHAR2,
  job   VARCHAR2 :='CLERK',
  mgr   NUMBER,
  hiredate DATE  DEFAULT SYSDATE,
  sal  NUMBER    DEFAULT 1000,
  comm  NUMBER   DEFAULT 0,
  deptNo NUMBER  DEFAULT 30
)
AS
BEGIN
  INSERT INTO emp VALUES(empNo,eName,job,mgr,hiredate,sal,comm,deptNo);
END;
调用如下:
EXEC addEmp(7776,'zhangsan','CODER',7788,'06-1月-2000',2000,0,10);  --没有使用默认值
EXEC addEmp(7777,'lisi','CODER',7788,'06-1月-2000',2000,NULL,10);  --可以使用NULL值
EXEC addEmp(7778,'wangwu',mgr=>7788);  --使用默认值
EXEC addEmp(mgr=>7788,empNo=>7779,eName=>'sunliu');  --更改参数顺序

示例7:使用NOCOPY编译提示
    当参数是大型数据结构时,如集合、记录和对象实例,把它们的内容全部拷贝给形参会降低执行速度,消耗大量内存。为了防止这样的情况发生,我们可以使用 NOCOPY提示来让编译器按引用传递方式给IN OUT模式的参数。
DECLARE
TYPE DeptList IS TABLE OF VARCHAR2(10);
dList  DeptList:=
DeptList('CORESUN','CORESUN','CORESUN','CORESUN');
PROCEDURE My_Proc(d IN OUT NOCOPY DeptList)
AS...
注意:NOCOPY只是一个提示,而不是指令。即使有时候我们使用了NOCOPY,但编译器有可能仍然会进行值拷贝。通常情况下NOCOPY是可以成功的。

二、维护过程
1、删除存储过程
    DROP PROCEDURE Proc_Name;
2、查看过程状态
    SELECT object_name,status  FROM USER_OBJECTS WHERE object_type='PROCEDURE';
3、重新编译过程
    ALTER PROCEDURE Proc_Name COMPILE;
4、查看过程代码
    SELECT * FROM USER_SOURCE WHERE TYPE='PROCEDURE';

 

三、参数的理解

-- 输出参数不可以修改解决的方法有两种
   --1 把参数改成输入参数  
   --2 就是参数改成 可输入输出的参数;
调用过程的 三个方式
       1 就是使用call
             在只用call方式调用函数的时候,必须加要括号,有参数,还要加参数值

 

             这个方式在命令窗口,调用过程,将不会出现输入的数据.
        2 就是使用exec 命令,进行命令调用过程, 使用命令,就必须在命令行里面输入
          过程名,这个命令窗口中,可加可不加() ,如果有参数的,就一定要加,还有参数值,参数值的类型要与
          变量类型相同.
        3 在语句块中进行调用过程,这个方式和命令模式类似,他们都是可要可不要(),
        -- 在2 和 3 中的 没有括号的情况是,过程没有参数 ,如果有,就必须要有()
       
                             
   输出参数的特点
        1 一个过程中,如果有输出参数(OUT 参数),在调用过程的使用,也要传入一个参数, 这个参数可以不用在调用的地方
        进行赋值,就直接传入一个声明好的一个变量,用来接受存储过程中的输出参数的值(OUT 参数)
        2 输入参数 值不可以改变在过程中,
       
           注意: 在存储过程中,他的参数类型不可以设置它的大小 ;    
               例如;
                           CREATE OR REPLACE PROCEDURE hello(
                               p_name IN VARCHAR2(12),
                                  p_age OUT NUMBER(10,2)
                                )
                               IS
                              BEGIN           
        如果有输出参数就必须有有一个参数进行接收 ;
       
     CREATE OR REPLACE PROCEDURE hello(
            p_name IN VARCHAR2,
            p_age OUT emp.sal%TYPE
     )
     IS
     BEGIN
       SELECT emp.sal + 3131 INTO p_age FROM emp WHERE empno = 7788 ;
                       
            dbms_output.put_line( p_age);
     END ;
     --------- 块中调用方法
     DECLARE
         v_nanme varchar2(12);
         v_age NUMBER (12,2);
     BEGIN
          hello (v_nanme,v_age);
            dbms_output.put_line(v_age);
     END ;
    
     -- 在这个过程中 传入的v_age 就是接受 存储过程输出参数的值 ; 类似于Java的中的返回值

     -- 理解 in out 参数
    
     CREATE OR REPLACE PROCEDURE hello1 (
            p_name IN OUT emp.ename%TYPE
     )
     IS
    
     BEGIN
          -- SELECT emp.ename INTO p_name FROM emp ;
              p_name:='a;sk , ' || p_name ;
           END ;
    --------------------------------------------------------------------------
      DECLARE
         v_nanme varchar2(12);
     BEGIN       
         v_nanme:='12312';
          hello1(v_nanme);
            dbms_output.put_line(v_nanme);
     END ;
    
    
SELECT emp.sal FROM emp WHERE emp.empno = 7788 ;

分享到:
评论

相关推荐

    ORACLE分页存储过程

    在分页存储过程中,主要理解了变量的动态赋值和输入输出参数的使用就非常简单了 下面为调用方法: var c_Preccount number; var c_Ppagecount number; var c_cur refcursor; exec proc_SpPag(1,'SELECT * FROM T_...

    oracle调试存储过程的过程详解

    oracle如果存储过程比较复杂,我们要定位到错误就比较困难,那么可以存储过程的调试功能 先按简单的存储过程做个例子,就是上次做的存储过程(proc_test) 1、先在数据库的procedures文件找到我们之前创建存储过程 ...

    oracle实验二 体系结构、存储结构与各类参数

    【实验目的】 1. 理解Oracle体系结构 2. 了解初始化参数文件以及初始化参数的含义 3. 掌握查看三类数据字典视图和动态性能视图的方法

    使用VB 调用oracle 数据库存储过程的研究

    使用VB 与oracle 进行连接是软件开发人员经常使用的组合,充分利用oracle 中的存储过程来处理应用 程序频繁使用的逻辑,不仅可以提高效率和安全性,而且也可以最大限度地利用资源,减少编程人员的重复劳 动。对存储过程...

    12、oracle数据库下的存储过程和函数

    ORACLE下的存储过程和函数 存储过程和函数是一种操作块,用来流程化、整体化处理业务逻辑的数据库操作方式。我理解的是相当于java开发语言中方法的概念,存储过程和函数的区别在于函数可以有返回值,而过程没有...

    通过ORACLE的UTL_HTTP工具包发送包含POST参数的请求

    通过ORACLE的UTL_HTTP工具包发送包含POST参数的请求,包含完成的原创代码、测试说明、相关文档,希望对您的学习有帮助。

    Oracle数据库管理员技术指南

    1.5 理解 CREATE DATABASE 命令 1.6 创建数据库的技术 1.6.1 利用 Oracle 安装程序创建数据库 1.6.2 使用安装程序创建数据库的注意 事项 1.6.3 怎样建立自己的定制数据库创建 脚本 1.6.4 如何从已有数据库...

    Oracle 10g应用指导

    包括加密Oracle子程序,存储应用程序用户名和口令,禁止修改删除数据库对象,Oracle数据加密以及丢失SYSMAN及资料档案库用户口令的解决方法。书中给出了丰富的图表,多数图例是作者根据多年实践总结出来的,图示简练...

    ORACLE9i_优化设计与系统调整

    §5.1 理解ORACLE性能优化 82 §5.1.1 响应时间与吞吐量的折衷 82 §5.1.2 临界资源 83 §5.1.3 过度请求的影响 83 §5.1.4 调整以解决问题 83 §5.2 优化的执行者 84 §5.3 设置性能目标 84 第7章 系统优化方法 85 ...

    Oracle+10g应用指导与案例精讲

    包括加密Oracle子程序,存储应用程序用户名和口令,禁止修改删除数据库对象,Oracle数据加密以及丢失SYSMAN及资料档案库用户口令的解决方法。书中给出了丰富的图表,多数图例是作者根据多年实践总结出来的,图示简练...

    ORACLE11G宝典.rar 是光盘里面的内容,书太厚咧没法影印啊

     6.6.2 查询表空间及其默认存储参数  6.6.3 查询表空间中数据文件的信息  6.6.4 查询临时表空间中临时文件的信息  6.6.5 查询表空间的空闲空间大小  6.6.6 查询数据段信息  6.7 在OEM中管理表空间  ...

    toad for oracle 11

    TOAD® 是 Quest Software公司的系列化Oracle开发和管理工具套件,包含集成化的开发、测试、管理与优化功能,可以大大提高数据库开发和管理人员的工作效率。 轻松浏览和管理Oracle数据库 TOAD 的 Schema Browser...

    Oracle9i数据库系统概述.pdf

    4 第二节:Oracle9i数据库体系结构 Oracle9i数据库的体系结构可以从以下四个 方面来理解: 物理存储结构 逻辑存储结构 内存结构 进程结构 5 一、物理存储结构 从数据的物理存储结构来看, Oracle9i数 据库由三类...

    最全的oracle常用命令大全.txt

    8、存储函数和过程 查看函数和过程的状态 SQL>select object_name,status from user_objects where object_type='FUNCTION'; SQL>select object_name,status from user_objects where object_type='PROCEDURE';...

    ORACLE大表分区

    支持自动ORACLE大表分区: 版本进度: 31. 20110420 V2.2 支持任意表任意时间字段分区 以下为安装部署部分: 1.分区相关脚本部署执行顺序,安装前请确保该用户拥有管理员权限, 同时请执行GRANT CREATE ANY TABLE ...

    韩顺平oracle学习笔记

    记住:欲速则不达,做任何事情要遵循他的规律,循序渐进,信心很重要 成为一个oracle高手过程:理解小知识点->做小练习->把小的只是点连成线->做oracle项目->形成只是面->深刻理解 Oracle基础部分:oracle基础使用; ...

    Oracle8i_9i数据库基础

    §16.2.3.2 对存储过程程序进行解释 279 §16.2.3.3 调试源码直到正确 279 §16.2.3.4 授权执行权给相关的用户或角色 279 §16.2.4 与存储过程相关数据字典 280 §16.3 创建函数 281 §16.4 过程和函数中的例外处理 ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    6.1.2 理解解释计划可能达不到目的的方式 143 6.1.3 阅读计划 146 6.2 执行计划 148 6.2.1 查看最近生成的SQL语句 149 6.2.2 查看相关执行计划 149 6.2.3 收集执行计划统计信息 151 6.2.4 标识SQL语句以便...

Global site tag (gtag.js) - Google Analytics