zoukankan      html  css  js  c++  java
  • 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;   --此处声明了一个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游标,存储过程,for循环,loop合一

    create or replace procedure libsys.add_money(money out number) ascursor cur is

    select amount from libsys.money_record;

    begin

    money:=0;

    for amounts in cur

    loop

    money:=money+amounts;

    end loop;

    end add_money;

  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/a393060727/p/3219008.html
Copyright © 2011-2022 走看看