`
nannan408
  • 浏览: 1770719 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

存储过程和参数,感觉说得比较好(转)

 
阅读更多
一、过程 (存储过程)
     过程是一个能执行某个特定操作的子程序。使用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
分享到:
评论

相关推荐

    用vs调试sql存储过程图文介绍

    这些功能使得在VS中调试SQL存储过程变得相当直观和强大。 总之,通过Visual Studio 2010的调试功能,我们可以有效地对SQL存储过程进行诊断和优化,大大提高了开发效率。对于经常需要处理存储过程的开发者来说,掌握...

    基于IDEF3的业务过程仿真模型的存储与获取

    未来的研究方向可能包括进一步优化模型存储架构,增强模型检索算法的智能性,以及开发更多用户友好的界面与工具,以更好地服务于业务过程优化与决策制定。随着技术的进步,IDEF3与业务过程仿真的结合有望在更广泛的...

    word转chm文件的软件

    总的来说,“word转chm文件的软件”为开发者和文档撰写者提供了一种便捷的方式,将传统的Word文档转化为适用于软件帮助系统的CHM文件,提高了信息传递的效率和用户体验。通过合理利用这类工具,可以更有效地管理和...

    OGG文件转换器 真正无损转换为OGG音乐

    "感觉格式工厂转的OGG质量很差"可能是因为格式工厂在进行转换时进行了有损压缩,导致音质下降,而"这个"(即OGG文件转换器)能够提供更好的无损转换效果。 【OGG音乐】是采用OGG Vorbis编码的音频文件,Vorbis是一...

    堆内存和栈内存详解,我感觉挺好的

    在本文中,我们将详细介绍堆内存和栈内存的概念、特点和使用场景,帮助程序员更好地理解和使用堆内存和栈内存,提高程序的执行效率和内存利用率。 一、预备知识 在 C/C++ 编译的程序中,程序的内存分配可以分为...

    中文伪原创制作工具-感觉还行不是最好

    5. UpdateApps.ini:更新应用程序的配置文件,可能包含了更新过程中的参数和指示。 6. data.mdb 和 daan.mdb:这两个文件是Access数据库文件,可能存储了工具的词库、语料库或者用户自定义的规则和设置。 7. dict...

    oracle+proc+c的学习,个人看了感觉非常好,学习中。

    Oracle提供了几种可存储在数据库中的PL/SQL程序类型,包括函数、过程、包和触发器。 - **函数**:命名的PL/SQL块,可以接收参数并返回一个值。 - **过程**:命名的PL/SQL块,可以接收参数,但不返回值。 - **包**:...

    搜集关于C++内存管理的几个网页,个人感觉比较好

    - **栈区**:由编译器自动分配和回收,用于存储局部变量、函数参数等。栈空间有限,一般为几MB,过大的数据会导致栈溢出。 - **堆区**:程序员通过`new`操作符动态分配,使用完后需手动用`delete`释放。内存大小...

    计算机启动过程PPT课件.pptx

    在正常情况下,POST 过程进行得非常快,我们几乎无法感觉到这个过程。 在计算机启动过程中,CPU 初始化是第一步。按下电源开关,电源向主板和其它设备供电,主板的控制芯片组会向 CPU 发出一个 RESET(重置)信号,...

    c#gdiplus图像可360度旋转模拟雷达扫描

    请注意,实际项目中可能需要根据具体需求调整旋转速度、图像大小和位置等参数,以达到最佳的视觉效果。同时,确保图片路径正确,防止因找不到图片导致程序出错。 总的来说,C#结合GDI+可以轻松实现图像的动态旋转,...

    单片机开发中应掌握的基本技巧.pdf

    其次,为了减少程序中的bug,建议关注系统运行中的超范围管理参数,包括物理参数、资源参数、应用参数和过程参数。物理参数主要指系统输入参数,如激励参数、采集处理中的运行参数和处理结束的结果参数。资源参数...

    Individualized HRTF matching and compression for virtual sound

    头相关传输函数(HRTF)是个体头部和耳朵对声波散射的过程描述,会产生双耳时间差(ITD)和双耳水平差(ILD),这两个参数反映了声源到耳朵的声波传输过程。人类听觉系统通过与以前的听觉经验比较ITD,可以实现声源...

    数字媒体笔试复习题,数字媒体笔试复习题

    首先,我们要了解媒体的五种类型:感觉媒体(如声音、图像)、表示媒体(如语言、文字)、显示媒体(如显示器、扬声器)、存储媒体(如硬盘、光盘)和传输媒体(如电缆、无线信号)。这些类型的媒体共同构成了我们...

    Windows API 一日一练

    这对于定制窗口的外观和感觉非常重要。 #### 21. SetWindowLongPtr 和 GetWindowLongPtr 函数 - **知识点**: 设置和获取窗口扩展属性的方法。 - **说明**: `SetWindowLongPtr` 和 `GetWindowLongPtr` 用于设置和...

    Oracle的初学者入门心得.docx

    但是,如果我们能够对 Oracle 有一个总体的熟悉,少走一些弯路,那么学习的过程将会变得更加轻松。 一、定位 Oracle 可以分为两大块:开发和治理。开发主要是写存储过程、触发器等,还有就是用 Oracle 的 Develop ...

    多媒体技术及应用复习.doc

    【多媒体技术及应用复习】 ...总之,多媒体技术及应用涵盖了声音和图像的数字化处理、压缩编码、多媒体信息的存储和传输等多个方面,这些知识点对于理解多媒体系统的工作原理以及在实际应用中的优化策略至关重要。

    多媒体基本概念与计算机系统方案.doc

    媒体可以分为感觉媒体、表示媒体、表现媒体、存储媒体和传输媒体五类。感觉媒体是指直接作用于人类感官的信息形式,如声音和图像;表示媒体是用于传输感觉媒体的编码方式,如声音编码和图像编码;表现媒体则是指用于...

    多媒体技术和应用复习.doc

    多媒体技术和应用是现代信息技术的...综上所述,多媒体技术和应用涵盖广泛的理论和技术,从信号处理到信息编码,再到实际的应用场景,它们共同推动了信息化社会的发展,使得信息的获取、分享和交流变得更加便捷和生动。

Global site tag (gtag.js) - Google Analytics