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

select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;-- 错误

也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧

2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。

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

3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。

可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...

4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错

 select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行
select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;-- 运行阶段报错,提示
ORA-01422:exact fetch returns more than requested number of rows

5.在存储过程中,关于出现null的问题

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

create table A(
id varchar2(50) primary key not null,
vcount number(8) not null,
bid varchar2(50) not null -- 外键 
);

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

select sum(vcount) into fcount from A where bid='xxxxxx';

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

if fcount is null then
    fcount:=0;
end 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;
              }
          });

转载:http://www.cnblogs.com/ZRJ-boke/p/6610524.html

Oracle存储过程语法学习相关推荐

  1. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  2. mysql 、oracle存储过程语法区别

    mysql .oracle存储过程语法区别 1.  条件语句:mysql使用elseif关键字,oracle是elsif关键字: oracle: if表达式 then 表达式: elsif 表达式: ...

  3. Oracle 存储过程语法及使用

    写在前面 本来这种东西作为一个写Java的我以为应该是基本用不上的,以前基本就是听过而已的一个概念,但是实际接到的一个需求就是需要数据库去定期执行存储过程,本着打好基础的目的,还是稍微学习了一下,本篇 ...

  4. oracle 存储过程语法

    oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 (     参数1 IN NUMBER,     参数2 IN NUMBER ) ...

  5. Oracle存储过程语法记录

    ORACEL存储过程 一.什么是存储过程 一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,专门干一件事一段sql语句. 二.存储过程的优点 1.效率高 2 ...

  6. oracle存储过程语法和用法,oracle存储过程 语法 函数 总结

    对于oracle 存储过程是很优秀的一种脚本语言.下面是一些整理: 一,Plsql 调试存储过程: 1. 在oracle的 配置和移植工具 àNET MANAGER中配置连接 2. 在plsql中新建 ...

  7. Oracle存储过程语法和基本使用

    前言 之前总结了mysql 的存储过程,这个Oracle 的存储过程语法有相似之处,但也有不同,所以就总结一下. 1.基本语法 1)基本结构 CREATE OR REPLACE PROCEDURE 存 ...

  8. oracle存储过程语法与使用

    oracle 存储过程的基本语法 1.基本结构 1 CREATE OR REPLACE PROCEDURE 存储过程名2 IS3 BEGIN4 NULL;5 END; 行1: CREATE OR RE ...

  9. oracle存储过程新手学习

    Oracle 执行存储过程五种方法(带参数& 不带参数) - 码农教程http://www.manongjc.com/detail/29-mqifuehigcvxcge.html PLSQL修 ...

最新文章

  1. svn mysql认证_svnapachemysql 认证搭建
  2. 15万人调查发现:做博后越久,一辈子挣的钱越少
  3. centos6查看java命令_linux 常用命令(五)——(centos7-centos6.8)JDK安装
  4. 图像相似度算法的C#实现及测评
  5. 关于优酷开放SDK相应的mediaplayer的监听器的设置之setOnBufferingUpdateListener
  6. semaphore 的原理与实现
  7. LeetCode-316. 去除重复字母(hard且重要)
  8. UI实用可临摹素材|剖析UI界面设计基本原则!
  9. Unity2020.1新功能探路:脚本开发相关更新
  10. 2009年3月全球程序设计语言排名(强烈推荐!)
  11. python encode函数_python_base64和encode函数
  12. 华栖云科技图形图像视音频算法岗面试经验
  13. [AE] ArcGIS Engine处理Landsat8数据
  14. java rxtx 串口_Java使用RXTX进行串口SerialPort通讯
  15. Spring Configuration Check Unmapped Spring configuration files found.Please configure Spring facet.
  16. RxJava 沉思录(一):你认为 RxJava 真的好用吗?
  17. 设置网页默认为360浏览器极速模式打开
  18. n维欧氏空间里的基本概念和符号
  19. 实现 iOS 内存检测工具
  20. 风险投资(VC)私募股权投资(PE)30问答

热门文章

  1. 12306 火车票订票助手
  2. AudioTrack 播放wav音频文件
  3. 如何下载Onon Office
  4. TCP—-SYN、ACK-、FIN、RST、PSH、URG-详解
  5. [题解]CF662D
  6. 京东2019校招算法岗笔试题
  7. 工程效率如何为研发赋能
  8. Unity AssetStore打不开怎么办
  9. 高一凡老师的数据结构
  10. 隐语义模型LFM(Latent Factor Model)