Oracle存储过程语法学习

Oracle存储过程:

1.1 第一单存储过程

–创建存储过程

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 replace procedure 存储过程名 
倘没有or
replace语词,则独自是新建一个储存过程。如果系统存在拖欠存储过程,则会报错。Create
or replace procedure
如果系统遭到尚无这存储过程即新建一个,如果系统受来其一存储过程尽管拿原本去掉,重新创设一个囤过程。 
积存过程名定义:包括存储过程叫和参数列表。参数誉为与参数类型。参数名叫无可知重复,
参数传递方式:IN, OUT, IN OUT 
IN 表示输入参数,按值传递方式。 
OUT
表示输出参数,可以知晓吧本引用传递方式。可以作为存储过程的出口结果,供外部调用者使用。 
IN OUT 即可作输入参数,也可发输出参数。 
参数的数据类型只待指明类型名即可,不欲指定宽度。 
参数的小幅由外部调用者决定。 
进程得产生参数,也可无参数 
变量声明块:紧跟着的as (is
)关键字,可以清楚也pl/sql的declare关键字,用于声明变量。 
变量声明块用于声明该存储过程要利用的变量,它的作用域为该存储过程。另外这里声明的变量必须指定宽度。遵循PL/SQL的变量声明规范。 
经过语句块:从begin
关键字开头为经过的语句块。存储过程的切实可行逻辑在此地来贯彻。 
那个处理块:关键字为exception
,为处理报告句产生的生。该部分吗可选 
结束块:由end关键字结果。

 

1.2 存储过程的参数传递方式 
仓储过程的参数传递有三种方法:IN,OUT,IN OUT . 
IN
按值传递,并且它们不允以存储过程遭到吃另行赋值。如果存储过程的参数没有点名存参数传递类型,默认为IN

立或多或少跟另外高级语言都不同。它一定于java于参数前面加上final关键字。

 

OUT
参数:作为出口参数,需要留意,当一个参数为指定为OUT类型时,就算在调用存储过程之前对拖欠参数进行了赋值,在储存过程遭到该参数的价值仍然是null.

 

INOUT 是实在的本引用传递参数。即可作为传播参数为可以当作传播参数。

 



Oracle存储过程语法学习:

 

积存过程创建语法:

       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;

 

注意事项:

1、  存储过程参数不带取值范围,in表示传入,out代表输出

2、  变量带取值范围,后面接分号

3、  在认清语句前最为好先用count(*)函数判断是否在该条操作记录

4、  用select 。。。into。。。给变量赋值

5、  在代码中丢掉大用 raise+异常名

 

以命名的特别:

命名的网颇                          有原因

ACCESS_INTO_NULL                   未定义对象

CASE_NOT_FOUND                     CASE 中设不含相应的 WHEN
,并且没有设置ELSE 时

COLLECTION_IS_NULL                集合元素未初始化

CURSER_ALREADY_OPEN            游标已经开辟

DUP_VAL_ON_INDEX                   唯一索引对应的列上有重新的价值

INVALID_CURSOR                       在未合法的游标上进行操作

INVALID_NUMBER                        内嵌的 SQL
语句不可知将字符转换为数字

NO_DATA_FOUND                        使用 select into
未返回行,或应用索引表未初始化的 

 

TOO_MANY_ROWS                      执行 select into 时,结果集超过一行

ZERO_DIVIDE                              除数为 0

SUBSCRIPT_BEYOND_COUNT        元素下标超过嵌套表或 VARRAY 的不过大值

SUBSCRIPT_OUTSIDE_LIMIT         使用嵌套表或 VARRAY
时,将下标指定为负数

VALUE_ERROR                            
赋值时,变量长度不足以容纳实际多少

LOGIN_DENIED                             PL/SQL 应用程序连接到 oracle
数据库时,提供了未得法的用户称或密码

NOT_LOGGED_ON                         PL/SQL 应用程序在无连接 oralce
数据库的图景下看数

PROGRAM_ERROR                         PL/SQL
内部问题,可能用重装数据字典& pl./SQL系统包

ROWTYPE_MISMATCH                    宿主游标变量和 PL/SQL
游标变量的归来路不配合

SELF_IS_NULL                              使用对象类型时,在 null
对象及调用对象方法

STORAGE_ERROR                         运行 PL/SQL 时,超出内存空间

SYS_INVALID_ID                           无效的 ROWID 字符串

TIMEOUT_ON_RESOURCE               Oracle 在待资源时过时

 

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,如:

ACCESS 1select a.appname from appinfo a;– 正确
ACCESS 2select a.appname from appinfo as a;– 错误

 也许,是担惊受怕与oracle中之仓储过程遭到的要害字as冲突之题材吧

 

2.在储存过程遭到,select某平等许段经常,后面要紧跟into,如果select整个记录,利用游标的讲话虽其它当别论了。

ACCESS 3  select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;– 有into,正确编译
ACCESS 4  select af.keynode from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;– 没有into,编译报错,提示:Compilation 
ACCESS 5  Error: PLS-00428: an INTO clause is expected in this SELECT statement

3.在动select…into…语法时,必须先确保数据库中起该修记下,否则会报出”no
data found”异常。

   可以在该语法之前,先使用select count(*)
from 查看数据库被是不是是拖欠记录,如果是,再以select…into…

 

4.在储存过程遭到,别名不可知同字段名称一致,否则虽然编译可以透过,但以运行阶段会报错

ACCESS 6 select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;– 正确运行
ACCESS 7select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;– 运行等报错,提示
ACCESS 8ORA-01422:exact fetch returns more than requested number of rowsACCESS 9

 

5.在储存过程遭到,关于出现null的题材

假定有一个表A,定义如下:

ACCESS 10create table A(
ACCESS 11id varchar2(50) primary key not null,
ACCESS 12vcount number(8) not null,
ACCESS 13bid varchar2(50) not null — 外键 
ACCESS 14);

假使以存储过程被,使用如下语句:

ACCESS 15select sum(vcount) into fcount from A where bid=’xxxxxx’;

比方A表中莫存bid=”xxxxxx”的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount
number(8):=0仍然无效,fcount还是会见化为null),这样之后用fcount时即可能有题目,所以当此间太好先判断一下:

ACCESS 16if fcount is null then
ACCESS 17    fcount:=0;
ACCESS 18end if;

如此即使一切ok了。

 

6.Hibernate调因此oracle存储过程

this.pnumberManager.getHibernateTemplate().execute(
       new HibernateCallback() {
             public Object doInHibernate(Session session)
                     throws HibernateException, SQLException {
                 CallableStatement cs = session.connection()
                       
 .prepareCall(“{call modifyapppnumber_remain(?)}”);
                 cs.setString(1, foundationid);
                 cs.execute();
                 return null;
              }
          });

 

 

当下篇文章是对Oracle存储过程学习之简练总结。希望能带来为大博友的援,也非常感谢各位博友的支撑!

如需转载请注明出处:http://www.cnblogs.com/ZRJ-boke/p/6610524.html

相关文章