存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。
    定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个:
    第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。
    第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。
    第三、有利于SQL语句的重用。
    oracle 存储过程的基本语法
    1.基本结构
    CREATE OR REPLACE PROCEDURE 存储过程名字
    (
    参数1 IN NUMBER,
    参数2 IN NUMBER
    ) IS
    变量1 INTEGER :=0;
    变量2 DATE;
    BEGIN
    END 存储过程名字
    2.SELECT INTO STATEMENT
    将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
    记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
    例子:
    BEGIN
    SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    xxxx;
    END;
    …
    3.IF 判断
    IF V_TEST=1 THEN
    BEGIN
    do something
    END;
    END IF;
    4.while 循环
    WHILE V_TEST=1 LOOP
    BEGIN
    XXXX
    END;
    END LOOP;
    5.变量赋值
    V_TEST := 123;
    6.用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;
    7.带参数的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;
    8.用pl/sql developer debug
    连接数据库后建立一个Test WINDOW

    在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

关于oracle存储过程的若干问题备忘
    1.在oracle中,数据表别名不能加as,如:

 

也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧
    2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。

 

  3.在利用select…into…语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
    可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select…into…
    4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错

 

5.在存储过程中,关于出现null的问题
    假设有一个表A,定义如下:

 

如果在存储过程中,使用如下语句:

如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:

 

    这样就一切ok了。
    6.Hibernate调用oracle存储过程