oracle存储过程、声明变量、for循环|转|

oracle存储过程、声明变量、for循环

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;
end TestArray;

此处声明了一个TestArray的类型数据,其实其为一张存储Info数据类型的Table而已,及TestArray 就是一张表,有两个字段,一个是name,一个是y。需要注意的是此处使用了Index by binary_integer 编制该Table的索引项,也可以不写,直接写成:type TestArray is table of info,如果不写的话使用数组时就需要进行初始化:varArray myPackage.TestArray; varArray := new myPackage.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游标,存储过程,for循环,loop合一

create or replace procedure libsys.add_money(money out number) as  cursor cur isselect amount from libsys.money_record;
begin
  money:=0;
  for amounts in cur
    loop
      money:=money+amounts;
    end loop;
end add_money;

本文转自:http://www.cnblogs.com/sumsen/archive/2012/05/30/2525431.html

时间: 2024-10-05 05:43:23

oracle存储过程、声明变量、for循环|转|的相关文章

Oracle存储过程——日常记录

代码规范 Oracle存储过程,关键字大写,变量小写并以v_开头,规范代码,提高可读性 赋值与判断符号 Oracle存储过程,变量赋值使用 := 符号,条件判断直接用 = 符号. 变量声明需在 begin…end 代码块之外. If语句 if语句中,if后不用加 ( ) , 代码前加then: else if写法为elsif,elsif与else都是可选: 结尾必须有end if: 标准结构如下: if…then …… elsif…then  --可选(多个) …… else       --可

[转]oracle存储过程、声明变量、for循环

oracle存储过程.声明变量.for循环 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(&ap

oracle存储过程、声明变量、for循环

oracle存储过程.声明变量.for循环  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(&a

oracle 存储过程 变量的声明和赋值的3种方式

oracle 存储过程 变量的声明和赋值的3种方式 CreationTime--2018年8月31日16点00分 Author:Marydon 1.声明变量的3种方式 按照数据类型的声明方式进行区分 方式一:直接声明数据类型 格式:变量名 数据类型(大小) V_START_DATE VARCHAR2(19); v_num number; 说明: 设置为字符串类型时,需要指定大小,否则报错: 变量的声明必须在"begin"关键字之前进行. --错误用法 BEGIN v_sql varch

Oracle 存储过程—为数传递变量

oracle 存储过程的基本语法create or replace procedure proc1( p_para1 varchar2, p_para2 out varchar2, p_para3 in out varchar2 )as v_name varchar2(20); begin v_name := '张三丰'; p_para3 := v_name; dbms_output.put_line('p_para3:'||p_para3); end;注:创建语句:create or repl

对循环内部反复声明变量的写法的一点想法?

之前看过一段代码,大概是是这样: function getVaildList(){ var _list = $('.list'); _list.each(function(item){ var listContent = $(this); var listName = listContent.find('listName').text(); var aaa = aaa; var bbb = bbb; //假设还有很多 var ccc = ccc; . . . . . . . . . //doso

mysql-进阶 声明变量/存储过程

声明变量 设置全局变量 set @a='一个新变量'; 在函数和储存过程中使用的变量declear declear a int unsigned default 1; 这种变量需要设置变量类型 而且只存在在 begin..end 这段之内 select .. into..  直接将表内内容赋值到指定变量当中 select name,bid into @a,@b from bank limit 1; 要注意一点就是变量名不能和字段名一致 存储过程 存储过程将一段通用的操作封装在一起 这样再不同平台

Java中循环声明变量方法

Java循环声明变量 之前想这样做,但是网上一直搜索不到,下面是我的方式 项目中 // 得到需要查询外表的数量,然后分别创建缓存,插入数据多的时候如果编码在缓存里面,就不需要再去查询数据库了.key:code/value:pk // 根据"数据来源"有多少非空的 就创建几个,使用 "数据来源字段"+Cache 当cacheMap的key Map<String, Map<String, String>> cacheMap =new HashMa

Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

Oracle存储过程可以有无参数存储过程和带参数存储过程. 一.无参程序过程语法 create or replace procedure NoParPro as ; begin ; exception //存储过程异常 ; end;         二.带参存储过程实例 create or replace procedure queryempname(sfindno emp.empno%type) as         sName emp.ename%type;         sjob emp