今儿个重新复习了一片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;
分享到:
相关推荐
在学习和使用Oracle函数和存储过程时,建议从以下几个方面入手: 1. 熟悉基本的SQL语法和操作,这是使用函数和存储过程的前提。 2. 精读Oracle帮助文档,理解每个函数的用法和存储过程的结构。 3. 练习编写简单的...
### Oracle函数调用存储过程详解 #### 背景与目的 在开发Oracle应用程序时,经常需要使用到存储过程和函数。这两种类型的数据库对象各有优势,可以满足不同的业务需求。有时候,为了更好地组织代码和提高复用性,...
调用Oracle函数的过程与调用存储过程类似,但创建CallableStatement时的SQL语句略有不同。由于函数会返回一个值,所以格式通常是`{? = call function_name(?, ?, ...)}`。在执行后,通过`CallableStatement....
本资源包“oracle函数大全与存储过程语法-中文.rar”涵盖了从Oracle 9i到10G版本的函数和存储过程的详细信息,旨在帮助用户深入理解和应用这些关键概念。 1. **Oracle函数大全**: - 函数是预定义的代码块,接受一...
Oracle数据库是世界上最广泛使用的数据库系统之一,其...总的来说,Oracle函数和存储过程是数据库开发的核心工具,通过深入学习和实践,你将能够更有效地管理和操作Oracle数据库,提升你的数据库技能和项目实施能力。
本资源"oracle函数大全及存储过程语法.rar"显然是一个关于Oracle函数和存储过程的详细指南,涵盖了各种常用和高级的函数以及存储过程的编写和使用方法。 一、Oracle函数 Oracle提供了丰富的内置函数,包括数值函数...
**二、Oracle函数** 函数与存储过程相似,但函数必须返回一个值,而存储过程可以不返回。函数可以被用作查询的一部分,提升SQL语句的灵活性。 1. **创建函数**:使用`CREATE FUNCTION`语句定义函数,例如: ```...
总结起来,Oracle函数和存储过程是数据库管理和开发中的重要工具,掌握它们的语法和应用对于优化数据库性能、提升开发效率以及保证数据安全具有重要意义。在实际工作中,应根据具体需求灵活运用,以实现更高效、更...
### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...
总结来说,存储过程和函数在Oracle数据库中是非常强大的工具,它们不仅可以帮助开发者提高代码的复用性和维护性,还可以通过数据库级别的安全性控制来增强系统的安全性。同时,通过包的概念,可以更好地组织和管理一...
oracle笔记存储函数和存储过程,有具体的代码案例!存储函数和存储过程的知识笔记!
### Oracle存储过程、游标、函数的详解 #### 一、概述 在Oracle数据库中,存储过程、游标和函数是非常重要的组成部分,它们为数据库管理提供了强大的编程能力。通过学习这些概念,我们可以更加灵活地管理和操作...
Oracle函数是数据库操作中的核心组成部分,它们允许开发人员和DBA执行各种计算、转换、查询和数据处理任务。手册中可能涵盖了以下几类函数: 1. 数学函数:如ABS(取绝对值)、MOD(取模)、ROUND(四舍五入)等,...
### Oracle学习之函数与存储过程详解 #### 一、函数的定义及应用 函数在Oracle中主要用于执行特定的计算或逻辑处理,并返回一个结果。它们是数据库编程中的重要组成部分,可以提高代码的重用性和可维护性。 #####...
### Delphi调用Oracle的...总结来说,本文详细介绍了如何在Delphi中调用Oracle的存储过程,包括存储过程的创建、Delphi环境的配置以及具体的代码实现。这为开发者提供了一个实用的例子,以便更好地理解和掌握这一技术。
- 创建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函数是预定义的代码块,它们接收输入参数并返回一个值。函数分为内置函数和自定义函数。内置函数包括数学函数(如:ROUND、TRUNC...