`
s103y
  • 浏览: 116238 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

存储过程总结一

阅读更多

1、创建存储过程

create or replace procedure test(var_name_1 in type,var_name_2 out type) as

--声明变量(变量名 变量类型)

begin

--存储过程的执行体

end test;

打印出输入的时间信息

E.g:

create or replace procedure test(workDate in Date) is

begin

dbms_output.putline('The input date is:'||to_date(workDate,'yyyy-mm-dd'));

end test;

2、变量赋值

变量名 := 值;

E.g:

create or replace procedure test(workDate in Date) is

x number(4,2);

 begin

 x := 1;

end test;

3、判断语句:

if 比较式 then begin end; end if;

E.g

create or replace procedure test(x in number) is

begin

        if x >0 then

         begin

        x := 0 - x;

        end;

    end if;

    if x = 0 then

       begin

        x: = 1;

    end;

    end if;

end test;

4、For 循环

For ... in ... LOOP

--执行语句

end LOOP;

(1)循环遍历游标

create or replace procedure test() as

Cursor cursor is select name from student; name varchar(20);

begin

for name in cursor LOOP

begin

 dbms_output.putline(name); 

end;

end LOOP;

end test;

(2)循环遍历数组

 create or replace procedure test(varArray in myPackage.TestArray) as

--(输入参数varArray 是自定义的数组类型,定义方式见标题6)

i number;

begin

i := 1;  --存储过程数组是起始位置是从1开始的,与java、C、C++等语言不同。因为在Oracle中本是没有数组的概念的,数组其实就是一张

--表(Table),每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历

for i in 1..varArray.count LOOP     

dbms_output.putline('The No.'|| i || 'record in varArray is:'||varArray(i));  

 end LOOP;

end test;

5、While 循环

while 条件语句 LOOP

begin

end;

end LOOP;

E.g

create or replace procedure test(i in number) as

begin

while i < 10 LOOP

begin   

 i:= i + 1;

end;

end LOOP;

 end test;

6、数组

首先明确一个概念:Oracle中本是没有数组的概念的,数组其实就是一张表(Table),每个数组元素就是表中的一个记录。

使用数组时,用户可以使用Oracle已经定义好的数组类型,或可根据自己的需要定义数组类型。

(1)使用Oracle自带的数组类型

x array; --使用时需要需要进行初始化

e.g:

create or replace procedure test(y out array) is

 x array; 

 begin

x := new array();

y := x;

end test;

(2)自定义的数组类型 (自定义数据类型时,建议通过创建Package的方式实现,以便于管理)

E.g (自定义使用参见标题4.2) create or replace package myPackage is

  -- Public type declarations   type info is record(     name varchar(20),     y number);

  type TestArray is table of info index by binary_integer;   --此处声明了一个TestArray的类型数据,其实其为一张存储Info数据类型的Table而已,及TestArray 就是一张表,有两个字段,一个是

name,一个是y。需要注意的是此处使用了Index by binary_integer 编制该Table的索引项,也可以不写,直接写成:type TestArray is

table of info,如果不写的话使用数组时就需要进行初始化:varArray myPackage.TestArray; varArray := new myPackage.TestArray();

end TestArray;

7.游标的使用 Oracle中Cursor是非常有用的,用于遍历临时表中的查询结果。其相关方法和属性也很多,现仅就常用的用法做一二介绍:

(1)Cursor型游标(不能用于参数传递)

create or replace procedure test() is  

cusor_1 Cursor is select std_name from student where  ...;  --Cursor的使用方式1   cursor_2 Cursor;

begin

select class_name into cursor_2 from class where ...;  --Cursor的使用方式2

可使用For x in cursor LOOP .... end LOOP; 来实现对Cursor的遍历

end test;

(2)SYS_REFCURSOR型游标,该游标是Oracle以预先定义的游标,可作出参数进行传递

create or replace procedure test(rsCursor out SYS_REFCURSOR) is

cursor SYS_REFCURSOR; name varhcar(20);

begin

OPEN cursor FOR select name from student where ... --SYS_REFCURSOR只能通过OPEN方法来打开和赋值

LOOP

 fetch cursor into name   --SYS_REFCURSOR只能通过fetch into来打开和遍历 exit when cursor%NOTFOUND;              --SYS_REFCURSOR中可使用三个状态属性:                                         ---%NOTFOUND(未找到记录信息) %FOUND(找到记录信息)                                         ---%ROWCOUNT(然后当前游标所指向的行位置)

 dbms_output.putline(name);

end LOOP;

rsCursor := cursor;

end test;

下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:

现假设存在两张表,一张是学生成绩表(studnet),字段为:stdId,math,article,language,music,sport,total,average,step                   一张是学生课外成绩表(out_school),字段为:stdId,parctice,comment

通过存储过程自动计算出每位学生的总成绩和平均成绩,同时,如果学生在课外课程中获得的评价为A,就在总成绩上加20分。

create or replace procedure autocomputer(step in number) is

rsCursor SYS_REFCURSOR;

commentArray myPackage.myArray;

math number;

article number;

language number;

music number;

sport number;

total number;

average number;

stdId varchar(30);

record myPackage.stdInfo;

i number;

begin

i := 1;

get_comment(commentArray); --调用名为get_comment()的存储过程获取学生课外评分信息

OPEN rsCursor for select stdId,math,article,language,music,sport from student t where t.step = step;

LOOP

fetch rsCursor into stdId,math,article,language,music,sport; exit when rsCursor%NOTFOUND;

total := math + article + language + music + sport;

for i in 1..commentArray.count LOOP

 record := commentArray(i);   

if stdId = record.stdId then 

 begin    

 if record.comment = &apos;A&apos; then    

  begin        

 total := total + 20;  

   go to next; --使用go to跳出for循环      

  end;    

end if; 

end; 

end if;

end LOOP;

<<continue>>  average := total / 5;

 update student t set t.total=total and t.average = average where t.stdId = stdId;

end LOOP;

end;

end autocomputer;

--取得学生评论信息的存储过程

create or replace procedure get_comment(commentArray out myPackage.myArray) is

rs SYS_REFCURSOR;

record myPackage.stdInfo;

stdId varchar(30);

comment varchar(1);

i number;

begin

open rs for select stdId,comment from out_school

i := 1;

LOOP

 fetch rs into stdId,comment; exit when rs%NOTFOUND;

record.stdId := stdId;

 record.comment := comment;

recommentArray(i) := record;

i:=i + 1;

end LOOP;

end get_comment;

--定义数组类型myArray

create or replace package myPackage is begin

type stdInfo is record(stdId varchar(30),comment varchar(1));

type myArray is table of stdInfo index by binary_integer;

end myPackage;


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/squirrelrao/archive/2008/07/11/2639571.aspx

分享到:
评论

相关推荐

    Oracle存储过程总结

    Oracle存储过程总结,Oracle存储过程总结,Oracle存储过程总结。

    存储过程总结很全很详细

    **存储过程**是数据库系统中预编译并存储的一系列SQL语句集合,其主要作用包括: 1. **提高执行效率**:存储过程在创建时即被编译,之后每次调用时无需再次解析和优化,从而加快了执行速度。 2. **保证数据安全**:...

    *oracle存储过程总结*oracle存储过程总结*

    根据提供的文件信息,我们可以归纳出以下Oracle存储过程的相关知识点: ### Oracle存储过程基础概念 ...以上是基于提供的部分内容对Oracle存储过程进行的总结,包含了从基础概念到具体应用实例的全面解析。

    java 调用存储过程总结

    java 调用存储过程 总结 创建表 创建存储过程 创建java程序调用

    oracle存储过程总结.doc

    Oracle 存储过程总结 Oracle 存储过程是数据库系统中的一种重要组件,它可以将复杂的业务逻辑封装在一起,提高数据库系统的性能和可维护性。本篇文章将对 Oracle 存储过程进行总结,包括创建存储过程、变量、游标、...

    java操作存储过程总结

    在Java中操作数据库的存储过程是一项常见的任务,这对于数据库交互和数据处理至关重要。这里我们将深入探讨如何使用Java调用不同类型的存储过程,包括无参函数、有返回值的存储过程以及有参数的函数。 1. **调用无...

    MySQL实验报告5(存储过程与函数)(1)(1).pdf

    1. 创建存储过程 存储过程是一种在数据库中定义并保存起来的可以被调用的子程序。它可以通过一个指定的名字来执行,可以有输入参数和输出参数。在报告中提到了创建了两个存储过程:count_sch5和count_sch2。它们分别...

    数据库的存储过程

    数据库的存储过程是数据库管理系统提供的一种预编译的SQL语句集合,它是数据库中的一个对象,可以被多次调用,从而提高数据访问的效率。在本文中,我们将深入探讨存储过程的基本理念、语法以及常见的实现方式,特别...

    用java调用oracle存储过程总结

    创建一个返回列表的存储过程如下:CREATE OR REPLACE PROCEDURE proc3(p1 IN int, cursor OUT SYS_REFCURSOR) ASBEGIN OPEN cursor FOR SELECT * FROM student WHERE ID &gt;= p1;END proc3;在Java中调用这样的存储过程...

    oracle 存储过程学习总结

    Oracle存储过程学习总结涵盖了Oracle中存储过程的编写与应用,涉及到字符串处理、游标使用、PL/SQL编程等方面的知识点。 首先,字符串处理是存储过程中常见的操作。文章中提到了多个内置函数,如CONCAT用于连接字符...

    oracle存储过程个人总结

    以上是对Oracle存储过程和PL/SQL的基础知识和应用场景的总结,对于数据库管理和应用程序开发具有重要价值。通过深入理解和实践,开发者可以更有效地管理数据,编写高效、健壮的数据库解决方案。

    plsql创建存储过程并创建job定时任务执行-详细笔记文档总结

    plsql创建存储过程并创建job定时任务执行详细笔记文档总结 在 Oracle 中,plsql 是一种强大的编程语言,可以用来创建存储过程和定时任务执行。在本文中,我们将详细介绍如何使用 plsql 创建存储过程并创建 job 定时...

    数据库实验报告-存储过程、触发器

    存储过程是数据库中一组预编译的SQL语句,它可以接收参数,执行特定任务,并返回结果。其优点包括: 1. 提高性能:存储过程在首次编译后,会缓存执行计划,多次调用时无需再次解析,从而提高执行速度。 2. 减少网络...

    Oracle调用存储过程总结

    此存储过程接收一个输入参数 `PARA1` 并返回一个输出参数 `PARA2`,它从表 `TESTTB` 中根据输入的ID查询相应的名称。 ```sql CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2, PARA2 OUT VARCHAR2) AS BEGIN ...

    mysql存储过程教程

    1. 返回值:通过`RETURN`语句,存储过程可以返回一个整数值。 2. 存储过程的嵌套:一个存储过程可以调用另一个存储过程。 3. 错误处理:使用`DECLARE`、`BEGIN...END`和`HANDLE`来处理异常。 总结,MySQL的存储过程...

    oracle存储过程解锁

    总结来说,解锁Oracle存储过程的过程涉及到识别锁定会话、查询锁定详情,并最终终止锁定会话以释放锁定。这一系列操作需要对Oracle数据库的系统视图有深入的理解,同时也需要具备一定的数据库管理经验。通过遵循上述...

    Java调用oracle存储过程总结

    本文将全面总结如何使用Java与Oracle存储过程进行交互。 首先,理解Oracle存储过程的基本概念。存储过程是预编译的SQL语句集合,存储在数据库中,可以接受参数、执行一系列操作并返回结果。它们提高了性能,减少了...

    Oracle存储过程返回结果集

    在Oracle数据库中,存储过程是一种预编译的SQL和PL/SQL代码集合,可以执行复杂的业务逻辑或数据处理任务。当需要从存储过程中返回多个结果时,通常会使用结果集。本篇将深入探讨如何在Oracle存储过程中创建并返回一...

Global site tag (gtag.js) - Google Analytics