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/soundcode/archive/2011/07/07/2100325.html,如需转载请自行联系原作者
目录
相关文章
|
机器学习/深度学习 存储 关系型数据库
MySQL数据库:常用数据类型
【2月更文挑战第7天】
198 0
|
NoSQL Linux MongoDB
Docker 解析:使用 Dockerfile 自动构建镜像
Docker 解析:使用 Dockerfile 自动构建镜像
283 0
|
11月前
|
Ubuntu 安全 Linux
云服务器安装宝塔教程
云服务器安装宝塔教程
|
10月前
|
缓存 NoSQL 关系型数据库
redis数据库超级详细(一)
本文介绍了 Redis 的基础与进阶知识。Redis 是一个使用 ANSI C 编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库,属于 NoSQL 数据库。文章详细讲解了 Redis 的安装、配置、数据类型及其操作,包括字符串、哈希、列表、集合和有序集合等。此外,还提供了 Python 操作 Redis 的示例代码,以及 Redis 在实际应用中的几个典型案例,如 KV 缓存、分布式锁、延迟队列、发布订阅和定时任务等。通过这些内容,读者可以全面了解 Redis 的核心功能和应用场景。
1321 1
|
11月前
|
Java 程序员 数据库连接
Java中的异常处理机制:理解与应用
在Java编程语言中,异常处理是保证程序健壮性的重要机制。本文将深入探讨Java异常处理的基本概念、不同类型的异常、异常处理的最佳实践以及如何创建自定义异常。通过具体示例,我们将展示如何在Java项目中有效管理和处理异常,从而提高代码的可靠性和可维护性。
|
分布式计算 DataWorks 安全
DataWorks常见问题之如何设置工单权限
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
308 1
|
算法 C语言
17【C语言 & 趣味算法】爱因斯坦的数学问题
17【C语言 & 趣味算法】爱因斯坦的数学问题
17【C语言 & 趣味算法】爱因斯坦的数学问题
|
SQL 存储 分布式计算
使用Relational Cache加速EMR Spark数据分析
Relational Cache的强大功能赋予了Spark更多的可能,通过Relational Cache,用户可以提前将任意关系型数据(Table/View/Dataset)cache到任意Spark支持的DataSource中,并支持灵活的cache数据组织方式,基于此,Relational Cache可以在诸多应用场景中帮助用户加速Spark数据分析。
|
Kubernetes 调度 Windows
K8s 1.14 发布了,Release Note 该怎么读?
在本篇文章中,我们将 1.14 的Release Note 按照主题进行了重新归纳和梳理,按照类别对重要变更进行了技术剖析和讨论。希望这种“分类解读”的方式,能够帮助大家更好的理解 1.14 这个发布的核心内容。
1306 0
|
C语言 流计算
利用gcc的__attribute__编译属性section子项构建初始化函数表【转】
转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性。这里讨论section子项的作用。
2466 0