zoukankan      html  css  js  c++  java
  • Oracle存储过程基本语法

    一、形式
      1 CREATE OR REPLACE PROCEDURE 存储过程名  //是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;
      2 IS                                                               //IS关键词表明后面将跟随一个PL/SQL体。
      3 BEGIN                                                         //BEGIN关键词表明PL/SQL体的开始。
      4 NULL;                                                         //NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
      5 END;                                                          //END关键词表明PL/SQL体的结束

    二、存储过程创建语法:
    create or replace procedure 存储过程名(param1 in type,param2 out type)
    as
    变量1 类型(值范围);
    变量2 类型(值范围);

    Begin
    Select count(*) into 变量1 from 表A where列名=param1;
    If (判断条件) then
    Select 列名 into 变量2 from 表A where列名=param1;
    Dbms_output。Put_line(‘打印信息');
    Elsif (判断条件) then
    Dbms_output。Put_line(‘打印信息');
    Else
    Raise 异常名(NO_DATA_FOUND);
    End if;
    Exception
    When others then
    Rollback;
    End;
    使用以下代码可以执行存储过程:
    BEGIN
    getDeptCount;
    END;
    以上存储过程还可以通过以下代码来简化调用:
    EXEC getDeptCount[;] 
    CALL  getDeptCount();

    注意事项:
    1, 存储过程参数不带取值范围,in表示传入,out表示输出
    类型可以使用任意Oracle中的合法类型。
    2, 变量带取值范围,后面接分号
    3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录
    4, 用select 。。。into。。。给变量赋值
    5, 在代码中抛异常用 raise+异常名

    6、定义无参存储过程时,存储过程名后不能加()

    7、在块中或是通过EXEC调用存储过程时可以省略()

    8、通过CALL调用无参存储过程必须加上()

    实例
    下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:
    现假设存在两张表,一张是学生成绩表(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 = 'A' 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;
  • 相关阅读:
    算法7-9:有向图搜索算法
    STM32W108无线传感器网络节点自组织与移动智能体导航技术
    no matching provisioning profiles found
    数组处理函数
    字符串相关函数整理
    [Other]来做一个微信打印机吧 -- 微信打印的设计思路參考
    [WF4.0 实战] 事件驱动应用
    OpenCV——RGB三通道分离
    泛型的使用
    JDBC使用步骤
  • 原文地址:https://www.cnblogs.com/feiwu123/p/5231183.html
Copyright © 2011-2022 走看看