当前位置:  数据库>oracle

ORA-01403:no data found exception的解决小道

    来源: 互联网  发布时间:2017-05-12

    本文导语: 问题:在使用select into from tablename这样的隐式游标的时候,如果查不到数据,那么会报ora-01403的错误。而每次使用显式游标,再打开取值就显得很麻烦。一个经验丰富的老师提出可以用类似max min等这样的聚合函数,来避免select in...

问题:在使用select into from tablename这样的隐式游标的时候,如果查不到数据,那么会报ora-01403的错误。而每次使用显式游标,再打开取值就显得很麻烦。一个经验丰富的老师提出可以用类似max min等这样的聚合函数,来避免select into带来的异常,又避免每次使用游标的麻烦。

效率和可行性测试:

①临时表

CREATE TABLE EDU.TEST
(
    ID NUMBER    NULL
)
TABLESPACE EDUCATION
NOLOGGING
PCTFREE 10
PCTUSED 0
INITRANS 1
MAXTRANS 255
STORAGE(BUFFER_POOL DEFAULT)
NOPARALLEL
NOCACHE

 
②  用PL/SQL块测试

A、create or replace procedure proc_max(id varchar2)
        as
          var dba_tables.table_name%type:=null;
          v_err_code number(10);
          v_err_txt  varchar2(400);
        begin
          select max(d.table_name)
          into var
          from dba_tables d
          where d.OWNER='JF'
          and d.TABLE_NAME='ORGCONNECTION1012'||id;
          if var is not null
          then
          insert into test values(id);
          commit;
          end if;
        exception
          when others then
            v_err_code:=sqlcode;
            v_err_txt:='测试:'||sqlerrm||DBMS_UTILITY.format_error_backtrace();
            insert into proc_err_logs(code,message,info,occur_date)
          values(v_err_code,v_err_txt,'EXCEPTION',SYSDATE);
          commit;
        end;

        /
        create or replace procedure proc_cur(id varchar2)
        as
          var dba_tables.table_name%type:=null;
          v_err_code number(10);
          v_err_txt  varchar2(400);
          type cursor_type is ref cursor;
          cur cursor_type;
        begin
          open cur for
            select d.table_name
            from dba_tables d
            where d.OWNER='JF'
            and d.TABLE_NAME='ORGCONNECTION1012'||id;
         
            fetch cur into var;
            close cur;
           
            if var is not null then
              insert into test
              values(id);
              commit;
            end if;
          exception
          when others then
            v_err_code:=sqlcode;
          v_err_txt:='测试:'||sqlerrm||DBMS_UTILITY.format_error_backtrace();
            insert into proc_err_logs(code,message,info,occur_date)
          values(v_err_code,v_err_txt,'EXCEPTION',SYSDATE);
          commit;
        end;

 B、

create  or replace procedure proc_test_max(var in number)
as
          v_err_code number(10);
          v_err_txt  varchar2(400);
          v_begin_time timestamp;
          v_end_time timestamp;
       
begin
select current_timestamp into v_begin_time from dual;

for i in 1..var loop
    proc_max(i);
end loop;
select current_timestamp into v_end_time from dual;

insert into proc_use_times(PROC_NAME,
    PROC_DESC,
    BEGIN_TIME,
    END_TIME)
  values('proc_test_max','测试'||var,v_begin_time,v_end_time);
  commit;
exception
    when others then
            v_err_code:=sqlcode;
          v_err_txt:='测试max:'||var||sqlerrm||DBMS_UTILITY.format_error_backtrace();
            insert into proc_err_logs(code,message,info,occur_date)
          values(v_err_code,v_err_txt,'EXCEPTION',SYSDATE);
end;

create  or replace procedure proc_test_cur(var in number)
as
          v_err_code number(10);
          v_err_txt  varchar2(400);
          v_begin_time timestamp;
          v_end_time timestamp;
begin
select current_timestamp into v_begin_time from dual;
for i in 1..var loop
    proc_cur(i);
end loop;
select current_timestamp into v_end_time from dual;
insert into proc_use_times(PROC_NAME,
    PROC_DESC,
    BEGIN_TIME,
    END_TIME)
    values('proc_test_cur','测试'||var,v_begin_time,v_end_time);
    commit;
exception
    when others then
            v_err_code:=sqlcode;
          v_err_txt:='测试cur:'||var||sqlerrm||DBMS_UTILITY.format_error_backtrace();
            insert into proc_err_logs(code,message,info,occur_date)
          values(v_err_code,v_err_txt,'EXCEPTION',SYSDATE);
end;

 
C、

----10次
begin
proc_test_max(10);
end;
/
begin
proc_test_cur(10);
end;

----100次
begin
proc_test_max(100);
end;
/
begin
proc_test_cur(100);
end;

---1000次
begin
proc_test_max(1000);
end;
/
begin
proc_test_cur(1000);
end;

---10000次
begin
proc_test_max(10000);
end;
/
begin
proc_test_cur(10000);
end;

----100000次
begin
proc_test_max(100000);
end;
/
begin
proc_test_cur(100000);
end;


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • oracle ORA-01114、ORA-27067错误解决方法
  • Orcle的package中访问其它Schema的表报错ORA-00942解决方法
  • oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法
  • 解决报错ora-32035的方法分析
  • ORA-12514及ORA-28547错误解决方案
  • 基于ORA-12170 TNS 连接超时解决办法详解
  • 安装oracle出现error:ora-01031:insufficient privilleges的解决
  • plsql连接oracle数据库报ora 12154错误解决方法
  • zilong28提问:Tomcat3.2报错内容是Error occurs when connecting DB: ORA-00020: maximum number of processes(59) exceeded 我应该如何解决,先谢了
  • ORA-28002 Oracle 11g存在密码过期问题解决方案
  • Linux 下数据库oracle出现ORA-27102错误的解决办法
  • Oracle ORA-22908(NULL表值的参考)异常分析与解决方法
  • PHP连接Oracle错误ORA-24324服务句柄未初始化的解决方法
  • ORACLE出现错误1033和错误ORA-00600的解决方法
  • 如何解决ORA-01843与NLS_DATE_FORMAT问题
  • 出现ORA-01401和ORA-01008错误?
  • Eclipse连接Oracle数据库的ORA-00604 ORA-12705错误
  • Oracle不能删除表 ORA-00604 ORA-01422 错误
  • 如何得到带有ora的行的下一行
  • 如何配置 linux 下 oracle 的 listener .ora 和
  • 浅析如何在tnsnames.ora中配置监听
  • [Oracle] 浅析令人抓狂的ORA-01555问题
  • aq.executeQuery: ORA-00020: maximum number of processes (59) exceeded
  • Oracle 数据库闪回功能设置出现ORA-19809和ORA-19804错误
  • ORA-00947:Not enough values (没有足够的值)的深入分析
  • solaris10 安装 ora9.2.0.1 时报错
  • java/j2ee iis7站长之家
  • 谁能帮忙解释一下: ORA-01000 : maximun open cursors exceeded
  • 关于Oracle游标的问题(ORA-01000: maximum open cursors exceeded)
  • 我在Linux7。3下面装了一个Oracle8i,但是现在启动不起来了,总是报错ORA-01031: insufficient privileges
  • oracle 11g导出数据时报ORA 1455错误的处理方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,