zoukankan      html  css  js  c++  java
  • oracle存储过程 --1

     一,oracle存储过程语法
     
     
     
    1.oracle存储过程结构
     
    CREATE OR REPLACE PROCEDURE oracle存储过程名字
     
    (
     
        参数1 IN NUMBER,
     
        参数2 IN NUMBER
     
    ) IS
     
    变量1 INTEGER :=0;
     
    变量2 DATE;
     
    BEGIN
     
    END oracle存储过程名字
     
     
     
    2.无返回值的oracle存储过程
     
    create or replace procedure xs_proc_no is
     
    begin
     
      insert into xuesheng values (3, 'wangwu', 90, 90);
     
      commit;
     
    end xs_proc_no;
     
     
     
    3.有单个数据值返回的oracle存储过程
     
    create or replace procedure xs_proc(temp_name in varchar2,
     
                                        temp_num  out number) is
     
      num_1 number;
     
      num_2 number;
     
    begin
     
      select yu_wen, shu_xue
     
        into num_1, num_2
     
        from xuesheng
     
       where xing_ming = temp_name;
     
      --dbms_output.put_line(num_1 + num_2);
     
      temp_num := num_1 + num_2;
     
    end;
     
    其中,以上两种与sql server基本类似,而对于返回数据集时,上述方法则不能满足我们的要求。在Oracle中,一般使用ref cursor来返回数据集。示例代码如下:
     
     
     
    4.有返回值的oracle存储过程(列表返回)
     
    首先,建立我们自己的包。并定义包中的一个自定义ref cursor
     
    create or replace package mypackage as
     
      type my_cursor is ref cursor;
     
    end mypackage;
     
    在定义了ref cursor后,可以书写我们的程序代码
     
    create or replace procedure xs_proc_list(shuxue   in number,
     
                                             p_cursor out mypackage.my_cursor) is
     
    begin
     
      open p_cursor for
     
        select * from xuesheng where shu_xue > shuxue;
     
    end xs_proc_list;
     
     
     
    5.SELECT INTO STATEMENT
     
      将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
     
      记录,否则抛出异常(若没有记录则抛出NO_DATA_FOUND)
     
      例子:
     
      BEGIN
     
      SELECT name,age into 变量1,变量2 FROM user where xxx;
     
      EXCEPTION
     
      WHEN NO_DATA_FOUND THEN
     
          xxxx;
     
      END;
     
      ...
     
     
     
    6.IF 判断
     
      IF V_TEST=1 THEN
     
        BEGIN
     
           do something
     
        END;
     
      END IF;
     
     
     
    7.WHILE 循环
     
      WHILE V_TEST=1 LOOP
     
      BEGIN
     
     XXXX
     
      END;
     
      END LOOP;
     
     
     
    8.变量赋值
     
      V_TEST := 123;
     
     
     
    9.用FOR IN 使用cursor
     
      ...
     
      IS
     
      CURSOR cur IS SELECT * FROM xxx;
     
      BEGIN
     
     FOR cur_result in cur LOOP
     
      BEGIN
     
       V_SUM :=cur_result.列名1+cur_result.列名2
     
      END;
     
     END LOOP;
     
      END;
     
     
     
    10.带参数的CURSOR
     
      CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
     
      OPEN C_USER(变量值);
     
      LOOP
     
     FETCH C_USER INTO V_NAME;
     
     EXIT FETCH C_USER%NOTFOUND;
     
        do something
     
      END LOOP;
     
      CLOSE C_USER;
     
     
     
    11.用pl/sql developer debug
     
      连接数据库后建立一个Test WINDOW
     
      在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
     
     
     
    二,oracle存储过程的若干问题备忘
     
     
     
    1.在oracle中,表别名不能加as,如:
     
    select a.name from user a;-- 正确
     
    select a.name from user as a;-- 错误

  • 相关阅读:
    IBM Minus One(water)
    约瑟夫问题的循环链表实现
    双向链表(差不多)
    单向链表的建立,插入,删除(复习一下)
    找新朋友(欧拉函数)
    验证角谷猜想(hd1279)
    Wolf and Rabbit(gcd)
    Big Number(大数)
    字串数(高精度组合数)
    寻找素数对(hd1262)
  • 原文地址:https://www.cnblogs.com/mr-hero/p/3489851.html
Copyright © 2011-2022 走看看