`
vipbooks
  • 浏览: 150363 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类

Oracle学习笔记(7) 开发PLSQL子程序和包

阅读更多
    哈哈,清明节放假回去了一下,真是太好了,回家的感觉真好啊!现在又开始出差之旅了,又好久没有来了,今天继续Oracle的学习!
     这是第七章的学习笔记,学习完第六章的动态SQL之后,开始要学习子程序和包的使用了……,希望大家能多给俺一些支持啊!
    编程时使用的工具是PLSQL Developer 7.1.4

在CMD下执行PL/SQL:
可以用exec或者call调用存储过程
定义变量时要用var,如:var username varchar2(20);
在调用变量时必须在变量名的前面加上双引号,如:exec :username := 'user1';
在调用存储过程时也要在变量名的前面加上双引号,如exec compute(:n1,:n2);
可以使用show error输出当前错误
查看存储过程的源代码:
select text from user_source where name='COMPUTE';

创建带输入、输出参数的存储过程:
在创建存储过程时可以定义in(输入参数,默认),out(输出参数)和in out(输入输出参数)三种参数
create or replace procedure compute(num1 in out number,num2 in out number) is
   n1 number(10,2);
   n2 number(10,2);
begin
   n1 := num1/num2;
   n2 := mod(num1,num2);
   -- 给要返回的变量赋值
   num1 := n1;
   num2 := n2;
end;
/

开发函数:
在指定函数的参数类型时,不能指定其长度;Return子句用于指定函数返回值的数据类型
IS或AS用于开始一个PL/SQL块(替代了declare)
在函数头部必须有Return子句,在函数体内至少要包含一个Return子句
在创函数时可以指定in(输入参数,默认),out(输出参数)和in out(输入输出参数)三种参数
-- 创建带输入输出参数的函数
create or replace function get_result(num1 number,num2 in out number)
return number is
   n_result number(6);
   n_remainder number;
begin
   n_result := num1/num2;
   n_remainder := mod(num1,num2);
   num2 := n_remainder;
   return n_result;
end;
/

开发包:
创建包规范,相当于Java中定义接口,在这里定义的变量、函数和子程序都是公有的
create or replace package emp_package is
   -- 定义公共变量
   n_temp number(10,2) := 888.888;
   -- 定义添加员工的存储过程
   procedure add_emp(empno number,name varchar2,job varchar2,manager varchar2,hiredate varchar2,salary number,commision varchar2,deptno number);
   -- 定义解雇员工的存储过程
   procedure fire_emp(n_empno number);
   -- 定义获得指定员工编号的员工工资的函数
   function get_salary(n_empno number) return number;
end emp_package;
/
-- 创建包体,相当于Java中的接口实现类
create or replace package body emp_package is
   -- 定义一个用来验证员工编号是否存在的私有函数
   function validate_empno(n_empno number) return boolean is
      n_temp employee.empno%type;
   begin
      select empno into n_temp from employee where empno = n_empno;
      return true;
   exception
      when no_data_found then return false;
      when others then return false;      
   end;
   -- 实现添加员工的存储过程
   procedure add_emp(empno number,name varchar2,job varchar2,manager varchar2,hiredate varchar2,
                     salary number,commision varchar2,deptno number) is
   begin 
      if validate_empno(empno) then
         raise_application_error(-20001,'编号为' || empno || '的员工已经存在!');
      else
         insert into employee values(empno,name,job,manager,hiredate,salary,commision,deptno);
         commit;
      end if;
    end;
    -- 实现解雇员工的存储过程
    procedure fire_emp(n_empno number) is
    begin
       if validate_empno(n_empno) then
          delete from employee where empno = n_empno;
          commit;
       else
          raise_application_error(-20003,'编号为' || n_empno || '的员工不存在!');
       end if;
    end;
    -- 实现获得指定员工编号的员工工资的函数
    function get_salary(n_empno number) return number is
       n_salary employee.salary%type;
    begin
       if validate_empno(n_empno) then
          select salary into n_salary from employee where empno = n_empno;
          return n_salary;
       else        
          raise_application_error(-20004,'编号为' || n_empno || '的员工不存在!');
       end if;
    end;   
end emp_package;
/

测试块:
declare
   n_1 number(10,2);
   n_2 number(10,2);
begin
   -- 测试存储过程compute
   n_1 := 20;
   n_2 := 8;
   -- 位置传递
   --compute(n_1,n_2);
   -- 名称传递
   compute(num1 => n_1,num2 => n_2);
   dbms_output.put_line('n_1=' || n_1 || '   n_2=' || n_2);
   -- 测试函数get_result
   n_1 := 20;
   n_2 := 8;
   n_2 := get_result(num1 => 100,num2 => n_1);
   dbms_output.put_line('n_1=' || n_1 || '   n_2=' || n_2);
   -- 测试包
   dbms_output.put_line('包中定义的公共变量:' || emp_package.n_temp);
   emp_package.add_emp(22,'李明','人事助理',0,'2006-08-15',4200,'人事',1);
   emp_package.fire_emp(2);
   dbms_output.put_line('编号为1的员工工资是:' || emp_package.get_salary(1));
end;
/

存储过程 VS 函数:
 
存储与过程相同点:
都有输入、输出、输入输出参数

不同点:
函数必须有返回值
函数不能修改数据

用途:
存储过程:主要用数据修改和业务处理
函    数:只能用于数据计算


重载子程序:
在一个包中定义的两个子程序名称相同,而参数不同。
在调用时Oracle将自动根据参数类型调用对应子程序。

限制:
如果两个子程序仅参数名称不同,则不算重载
参数类型相同,而返回类型不同,不算重载
重载的参数必须是基本类型。
分享到:
评论
1 楼 justin18 2010-06-22  
最近在自己學習oracle編程,有很多地方弄不明白,也不知道去請教誰.今天看到作者的這些學習筆記,感覺受益匪淺,對我太有幫助了,謝謝作者在百忙中整理出這麼好的東西!

相关推荐

    Oracle SQL & PLSQL学习笔记

    - CALL:调用 PL/SQL 或 Java 子程序。 - EXPLAIN PLAN:分析查询计划,帮助优化查询性能。通过EXPLAIN PLAN,可以查看数据库如何执行SQL语句,了解其访问数据的方式,从而优化查询。 理解这些基本概念和语句是掌握...

    oracle笔记二--plsql 编程.txt

    **标题**: oracle笔记二--plsql 编程 **描述**: oracleoracleoracleoracleoracleoracleoracleoracle(推测为占位符文本,无实际意义) **标签**: oracle **部分内容**: 在部分内容中提到了关于Oracle 10g的安装与...

    ORACLE_PlSql-甲骨文学习笔记

    ### ORACLE_PlSql-甲骨文学习笔记 #### 一、创建表 ##### 创建表一 ```sql CREATE TABLE TABLE_NAME ( AAA INTEGER CONSTRAINT PK_TABLE_NAME PRIMARY KEY, BBB VARCHAR2(10) NOT NULL, DOB DATE, CCC VARCHAR...

    精通oracle 10g plsql 编程-学习笔记

    ### 精通Oracle 10g PL/SQL编程学习笔记 #### 一、PL/SQL综述 **1.1 PL/SQL的功能与作用** PL/SQL (Procedural Language for SQL) 是一种专门为Oracle数据库设计的过程化语言,它结合了SQL的数据处理能力与过程化...

    PLSQL学习笔记

    这些只是PL/SQL学习笔记的部分内容,实际使用中还会涉及游标、子程序、异常处理、动态SQL等多个方面。掌握PL/SQL能帮助开发者更有效地管理和操作Oracle数据库,实现复杂的数据处理任务。通过不断实践和学习,你可以...

    plsql的学习笔记

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle公司为在其数据库系统上扩展SQL而开发的一种过程化编程语言。它结合了SQL的数据操纵功能和过程性编程语言的特点,提供了更强大的数据处理能力...

    sql和plsql学习笔记

    - 子程序:包括函数和过程,函数返回值,过程不返回。 - 游标:用于逐行处理查询结果,实现动态数据处理。 - 异常处理:通过EXCEPTION部分捕获和处理运行时错误。 - 包(Package):将相关的过程、函数和变量...

    达内的plsql笔记和代码

    它是SQL的扩展,增加了程序化的元素,如循环、条件语句和子程序,使得数据库管理和开发更加灵活高效。达内的PLSQL笔记和代码资料,无疑是学习和提升PLSQL技能的重要资源。 在`PLSQL_note.pdf`中,你可能会找到以下...

    oracle课上笔记

    综上所述,这些笔记提供了一个全面的Oracle学习框架,涵盖了从基础的SQL查询到高级的PL/SQL编程,以及数据库的外部接口。通过深入学习并实践这些内容,你可以提升自己在Oracle数据库管理、开发和维护方面的专业能力...

    PLSQL-8.rar

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库系统中的一个编程语言,它扩展了标准SQL的功能,增加了流程控制、异常处理和子程序等特性,使得开发者能够编写复杂的数据库应用程序。...

    plsql中文

    1Z0-007是Oracle Certified Associate, Oracle Database 12c Administrator Certified Professional的考试代码,这个文档可能是针对该考试的复习笔记或学习指南,包含PL/SQL部分的要点,如数据类型、子程序...

    Oacle DBA的PL SQL学习笔记

    Oracle数据库管理员(DBA)的PL/SQL学习笔记主要包括了以下几个知识点: 一、PL/SQL基本的语法格式 PL/SQL是Oracle提供的过程化语言,其基本的语法格式如下: - 声明部分(DECLARE):用于声明变量、常量、游标、...

    Oracle笔记整理

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在...以上内容仅是Oracle数据库学习的一部分,实际的笔记整理可能会包含更多细节和实战经验。学习Oracle不仅要理解这些概念,还要通过实践来加深理解和应用。

    Oracle PL SQL Programming 第五版-带书签目录超清文字版

    4. **PL/SQL子程序**:介绍如何创建和调用过程和函数,包括参数模式、默认值、重载以及子程序的返回值。 5. **游标**:讲解如何使用游标进行动态查询和逐行处理结果集,包括显式和隐式游标,以及游标的使用技巧。 ...

    【筆記版】PLSQLProgramDesign

    2. **可读性和可维护性**:PL/SQL支持子程序、块结构和异常处理,提高了代码的可读性和可维护性。 3. **数据处理效率**:PL/SQL可以直接在数据库服务器上运行,减少了数据在网络间的传输,提高了性能。 4. **安全**...

    orcale笔记

    ### Oracle 笔记知识点梳理 #### 一、用户管理与解锁 - **解锁用户**:通过`ALTER USER scott ACCOUNT UNLOCK;`命令可以解锁scott用户账户。 - **创建用户**:使用`CREATE USER username IDENTIFIED BY password;`...

    PL/SQL文本文档

    4. **子程序**: - **过程(PROCEDURE)**:无返回值,主要用于执行一系列操作。 - **函数(FUNCTION)**:有返回值,可作为其他表达式的一部分使用。 - **游标(CURSOR)**:用于逐行处理查询结果,常用在循环中...

Global site tag (gtag.js) - Google Analytics