`
xiaofan_0204
  • 浏览: 126654 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle函数、存储过程总结

阅读更多
今儿个重新复习了一片Oracle的函数以及存储过程,特地的写下在的复习结果!希望对各位能起到一点点的帮助!

------------------------------------------------函数篇----------------------------------------------------
--创建一个简单函数
create or replace function get_hello_msg
return varchar2 as
begin
       return 'hello_world';
end get_hello_msg;

--在数据字典中查看函数的定义信息
select name,type,line,text from user_source where lower(name) = 'get_hello_msg';

select object_name,object_type,status from user_objects where lower(object_name)='get_hello_msg';

--查看函数的返回值,注意要想输出值得先开启服务器端:set serverout on;
declare msg varchar2(20);
begin 
        msg := get_hello_msg;
        dbms_output.put_line(msg);
end;

--函数中的括号,Oracle在遇到变量时,如果该变量可用,则使用该变量,如果该变量不可用,才尝试将其解释为一个函数名
declare 
        msg varchar2(20);
        get_hello_msg varchar2(20);
begin
        get_hello_msg := 'welcome message';
        msg := get_hello_msg;
        dbms_output.put_line(msg);
end;

--X:注意不要声明一个函数同名的变量,否则,系统将无法确定引用该函数
declare 
        msg varchar2(20);
        get_hello_msg varchar2(20);
begin
        get_hello_msg := 'welcome message';
        msg := get_hello_msg();
        dbms_output.put_line(msg);
end;

--函数的参数:本事例演示如何在数据中中计算个人所得税
create or replace
function get_tax(p_salary number)
return number as
begin
       declare tax_salary number;
       begin
               tax_salary := p_salary -2000;
               
               if tax_salary <=0 then
                  return 0;
               end if;
               if tax_salary <=500 then
                  return tax_salary*5/100;
               end if;
               if tax_salary <=2000 then
                  return tax_salary*10/100-25;
               end if;
               if tax_salary <=5000 then
                  return tax_salary*15/100-125;
               end if;
               if tax_salary <=20000 then
                  return tax_salary*20/100-375;
               end if;
               if tax_salary <=40000 then
                  return tax_salary*30/100-3375;
               end if;
        end;
end get_tax;

--查看刚刚创建的函数
select object_name,object_type,status from user_objects where lower(object_name)='get_tax';

--创建函数的调用
select get_tax(6000) tax from dual;

--典型的函数举例:行转列的问题
--创建students表
create table students
(
       student_id      number         primary key,
       student_name    varchar2(20),
       student_age     number
)

--创建序列
create sequence students_seq start with 1 increment by 1;

--插入测试数据
insert into students values(students_seq.nextval,'zhangsan',23);
insert into students values(students_seq.nextval,'lisi',33);
insert into students values(students_seq.nextval,'wangwu',23);
insert into students values(students_seq.nextval,'zhass',43);
insert into students values(students_seq.nextval,'zhan',13);
insert into students values(students_seq.nextval,'zngsan',83);
insert into students values(students_seq.nextval,'zangsan',43);
insert into students values(students_seq.nextval,'angsan',27);
insert into students values(students_seq.nextval,'gsan',43);
insert into students values(students_seq.nextval,'angsan',25);

commit;

select * from students;

--创建函数,该函数是一个行转列的问题:演示如何获取所有学生的姓名
create or replace
function get_student_str
return varchar2      --返回一个字符串(即所有学生的姓名)
as                   --
begin
       declare cursor cu_student is 
               select student_name 
               from students 
               order by student_id;--声明一个游标,该游标用户获取数据库表中所有学生的姓名记录
               student_name        varchar2(20);--该变量用于获取游标记录
               student_name_str    varchar2(500);--返回值
       begin 
               open cu_student;
               fetch cu_student into student_name;--获取游标记录值
               while cu_student%found loop
                     student_name_str := student_name_str || student_name || ',';
                     fetch cu_student into student_name;
               end loop;
               return substr(student_name_str,1,length(student_name_str)-1);
       end;
end get_student_str;

--执行结果
set serverout on;
declare rowString varchar2(500);
begin 
        rowString := get_student_str();
        dbms_output.put_line(rowString);
end;

------------------------------------------------存储过程篇-------------------------------------------
--创建存储过程
create or replace procedure update_students
as
begin
       update students set student_age = 10;
       commit;
end update_students;

--查看存储过程在数据字典中的信息
select object_name,object_type,status from user_objects where lower(object_name)='update_students';
--在user_source中查找存储过程的信息
select * from user_source where lower(name)='update_students';

--执行存储过程
execute update_students;
--在代码块中执行存储过程
begin 
        update_students;
end;

--存储过程中的in,out,in out参数的使用
create or replace procedure update_students_in_out(s_id in number, s_name out varchar2)
as
begin
       update students set student_age = 100 where student_id = s_id;
       select student_name into s_name from students where student_id = 1;
       commit;
end update_students_in_out;

--in out与in,out中间需要注意的地方
--首先,存储过程可能被多个用户调用,那么输出参数的变量,将被频繁且无规律的更新
--控制该变量将变得非常困难。
--其次,in out参数具有可输出的性质,那么,将不能使用常量传入参数,否则,将会出现
--编译错误
--所以,除非必要,应该首先选择单向参数(in/out)

--存储过程的两种传参方式
--1:位置表示法;2:名称标识法
--需要注意的是:一旦使用的名称标识法,那么其后的参数也必须使用名称表示法!否则将会报
--PLS-00312:a positional parameter association may not follow a named association
--名称标识法的事例
declare age number;
begin
        update_students_in_out(in_name=>'zhangsan',out_age=>age);
        dbms_output.put_line(age);
end;

--参数默认值
create or replace
procedure insert_student
            (
                   in_student_id in number,
                   in_student_name in varchar2,
                   in_student_age in number default 20
            )
            as
            begin
                   insert into students values(in_student_id,in_student_name,in_student_age);
                   commit;
            end insert_student;
--需要注意的是:1:默认值只是对in参数而言的,out和in out参数没有默认值.
--             2:有默认值的参数应该置于参数的末尾,因为有时用户需要修给该参数
--             3:没有默认值的参数,参数顺序可以遵循:"IN参数"——"OUT参数"——"IN OUT参数"

--执行存储过程的两种方式
execute pro;--通过execute命令调用存储过程
begin       --在代码块中执行存储过程
        pro;
end;




分享到:
评论
1 楼 hzxlb910 2014-03-23  
写的不错。

相关推荐

    oracle oracle函数 存储过程

    在学习和使用Oracle函数和存储过程时,建议从以下几个方面入手: 1. 熟悉基本的SQL语法和操作,这是使用函数和存储过程的前提。 2. 精读Oracle帮助文档,理解每个函数的用法和存储过程的结构。 3. 练习编写简单的...

    oracle函数调用存储过程

    ### Oracle函数调用存储过程详解 #### 背景与目的 在开发Oracle应用程序时,经常需要使用到存储过程和函数。这两种类型的数据库对象各有优势,可以满足不同的业务需求。有时候,为了更好地组织代码和提高复用性,...

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

    调用Oracle函数的过程与调用存储过程类似,但创建CallableStatement时的SQL语句略有不同。由于函数会返回一个值,所以格式通常是`{? = call function_name(?, ?, ...)}`。在执行后,通过`CallableStatement....

    oracle函数大全与存储过程语法-中文.rar

    本资源包“oracle函数大全与存储过程语法-中文.rar”涵盖了从Oracle 9i到10G版本的函数和存储过程的详细信息,旨在帮助用户深入理解和应用这些关键概念。 1. **Oracle函数大全**: - 函数是预定义的代码块,接受一...

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

    Oracle数据库是世界上最广泛使用的数据库系统之一,其...总的来说,Oracle函数和存储过程是数据库开发的核心工具,通过深入学习和实践,你将能够更有效地管理和操作Oracle数据库,提升你的数据库技能和项目实施能力。

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

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

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

    **二、Oracle函数** 函数与存储过程相似,但函数必须返回一个值,而存储过程可以不返回。函数可以被用作查询的一部分,提升SQL语句的灵活性。 1. **创建函数**:使用`CREATE FUNCTION`语句定义函数,例如: ```...

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

    总结起来,Oracle函数和存储过程是数据库管理和开发中的重要工具,掌握它们的语法和应用对于优化数据库性能、提升开发效率以及保证数据安全具有重要意义。在实际工作中,应根据具体需求灵活运用,以实现更高效、更...

    oracle 存储过程 函数 dblink

    ### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...

    Oracle存储过程、函数和包

    总结来说,存储过程和函数在Oracle数据库中是非常强大的工具,它们不仅可以帮助开发者提高代码的复用性和维护性,还可以通过数据库级别的安全性控制来增强系统的安全性。同时,通过包的概念,可以更好地组织和管理一...

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

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

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

    ### Oracle存储过程、游标、函数的详解 #### 一、概述 在Oracle数据库中,存储过程、游标和函数是非常重要的组成部分,它们为数据库管理提供了强大的编程能力。通过学习这些概念,我们可以更加灵活地管理和操作...

    oracle 函数大全 参考函数 手册 速查 chm格式

    Oracle函数是数据库操作中的核心组成部分,它们允许开发人员和DBA执行各种计算、转换、查询和数据处理任务。手册中可能涵盖了以下几类函数: 1. 数学函数:如ABS(取绝对值)、MOD(取模)、ROUND(四舍五入)等,...

    oracle学习之函数存储过程

    ### Oracle学习之函数与存储过程详解 #### 一、函数的定义及应用 函数在Oracle中主要用于执行特定的计算或逻辑处理,并返回一个结果。它们是数据库编程中的重要组成部分,可以提高代码的重用性和可维护性。 #####...

    delphi调用Oracle的存储过程

    ### Delphi调用Oracle的...总结来说,本文详细介绍了如何在Delphi中调用Oracle的存储过程,包括存储过程的创建、Delphi环境的配置以及具体的代码实现。这为开发者提供了一个实用的例子,以便更好地理解和掌握这一技术。

    oracle存储过程函数生成DEMO

    - 创建Oracle函数使用`CREATE OR REPLACE FUNCTION`语句,例如: ```sql CREATE OR REPLACE FUNCTION function_name (param1 datatype, param2 datatype) RETURN datatype IS BEGIN -- SQL语句和PL/SQL代码 ...

    oracle 函数大全 存储过程语法

    本篇文章将针对“Oracle函数大全”和“存储过程语法”进行深入的探讨。 首先,Oracle函数是预定义的代码块,它们接收输入参数并返回一个值。函数分为内置函数和自定义函数。内置函数包括数学函数(如:ROUND、TRUNC...

Global site tag (gtag.js) - Google Analytics