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了。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

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;

     }

   });

时间: 2025-01-21 11:25:57

Oracle存储过程的常见问题的相关文章

用PHP执行Oracle存储过程示例

oracle|存储过程|示例|执行 <?//在oracle中执行存储过程示例//供大家参考$gConn=ocilogon("test","test"); /* OCIDefineByPos example thies@digicol.de (980219) *///discrate与nEcode是out parameter,其余均是 in parameter.//存储过程get_discrate存放于package ebiz_pg中.$stmt = OCIPa

用PHP调用Oracle存储过程

oracle|存储过程 从开始学习PHP就来喜悦国际村,好几个月了,学到不少东西,自己写了个例子希望有点用处. PHP程序访问数据库,完全可以使用存储过程,有人认为使用存储过程便于维护不过仁者见仁,智者见智,在这个问题上,偶认为使用存储过程意味着必须要DBA和开发人员更紧密配合如果其中一方更变,则显然难以维护.但是使用存储过程至少有两个最明显的优点:速度和效率.使用存储过程的速度显然更快.在效率上,如果应用一次需要做一系列SQL操作,则需要往返于PHP与ORACLE,不如把该应用直接放到数据库方

使用OLE DB和ADO调用返回记录集的Oracle存储过程

摘要 OLE DB是建立在ODBC成功基础上的一种开放规范,它为访问和操纵不同类型数据提供开放的标准.ADO是OLD DB的一个消费者,它提供了对OLE DB数据源应用级的访问功能.在应用程序中使用OLE DB和ADO,可以高效地调用返回记录集的Oracle存储过程. 关键字 OLE DB ADO 存储过程 记录集 1 前言 在基于Oracle数据库的ADO应用程序的开发过程中,为了提高执行速度和降低网络流量,往往要在应用程序中调用Oracle数据库服务器端的存储过程.有的存储过程需要返回多行的

jsp中调用Bean,然后在Bean中调用oracle存储过程

新手在写程序时,一定要胆大心细,而且要有耐心,不妥协,不懂就翻书,网上查资料,问朋友,坚决进行到底. 最近一直凭着ASP的知识在摸索中前进,一跑坎坷,自不用说了.言归正传. 建立一个登录系统,要求达到以下目的. 1.用户通过Bean来认证以及得到得到用户信息. 2.记录用户登录信息,如用户登录次数,最后登录时间. 3.记录操作日志. 未解决及疑惑的问题: 1.用户登录后的Session是否可以通过Bean来判断. 2.通过Bean调用ORACLE存储过程,返回select后的记录集. 操作步骤:

大家一起分享C#调用oracle存储过程

oracle|存储过程 大家一起分享C#调用oracle存储过程 执行结果 ?????? ? ?????? ? ????? ? Oracle方面 1.创建Oracle过程存储 create or replace procedure proce_test(paramin in varchar2,paramout out varchar2,paraminout in out varchar2)as? varparam varchar2(28);begin? varparam:=paramin;? p

利用游标返回结果集的的例子(Oracle 存储过程)

oracle|存储过程|游标 在sqlplus中建立如下的内容:1.程序包 SQL> create or replace package types  2  as  3      type cursorType is ref cursor;  4  end;  5  / 程序包已创建. 2.函数SQL> create or replace function sp_ListEmp return types.cursortype  2  as  3      l_cursor    types.c

oracle 存储过程的基本语法

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_FO

Jsp中调用Oracle存储过程的小例子

js|oracle|存储过程 以下的例子转自csdn论坛: *执行一条insert语句并传参数*/create or replace procedure p_test2(i in number) asbegininsert into t values (i,'x'||to_char(i));commit;end;/ <%@ page language="java" contentType="text/html;charset=gb2312"%><%

DELPHI 调用 Oracle 存储过程并返回数据集的例子.

oracle|存储过程|数据 环境: Win2000 + Oracle92 一.先在 Oracle 建包     CREATE OR REPLACE PACKAGE pkg_test     AS        TYPE myrctype IS REF CURSOR;        PROCEDURE get(i_test INTEGER,p_rc OUT myrctype);     END pkg_test;        CREATE OR REPLACE PACKAGE BODY pkg