`

ORACLE NO_DATA_FOUND的三种处理办法

阅读更多

Oracle中存储过程中,如果需要将表中的值赋给变量,一般采取这样的方式

SELECT col
INTO v_col
FROM t_table
WHERE condition

 如果找不到数据,就会有 数据找不到的异常

 

 

有三种方式解决

1. 普通的异常捕获的方式

2. 通过表关联left join的方式

3. 通过max的方式

 

方法1 语法:

 

  BEGIN
    SELECT col
    INTO v_col
    FROM t_table 
    WHERE condition
  EXCEPTION WHEN NO_DATA_FOUND THEN
       do something
  END;

 

方法2 语法:

 

 

select nvl(b.col,自定义的默认值) into v_col
from (select 1 rn from dual) a
left join (
    SELECT col,rownum rn
    FROM t_table
    WHERE condition
) b on a.rn=b.rn

 

 

方法3 语法:

 

SELECT max(col) INTO v_col
FROM t_table
WHERE condition

 

初始化数据

 

 

create table test_sj_salary
(
   id integer primary key,
   name varchar2(100),
   salary integer
);

truncate table test_sj_salary;

insert into test_sj_salary (ID, NAME, SALARY)
values (1, '张三', 5000);

commit;

 

三种方法的演示

 

declare 
  v_salary integer;
begin 
  --通过异常方式处理找不到数据
  begin
    select tss.salary into v_salary
    from test_sj_salary tss
    where tss.name='蒙牛';
  EXCEPTION WHEN NO_DATA_FOUND THEN
    v_salary := -1;
  end;
   
  dbms_output.put_line('Exception deal '||to_char(v_salary));
  
  --通过表关联的方式实现
  select nvl(b.salary,-2)  into v_salary
  from (select 1 rn from dual) a
  left join (
    select tss.salary,rownum rn
    from test_sj_salary tss
    where tss.name='伊利' 
  ) b on a.rn=b.rn;
  
  dbms_output.put_line('Table deal '||to_char(v_salary));
  
  --通过max方式处理
  select max(tss.salary) into v_salary
  from test_sj_salary tss
  where tss.name='光明';
  
  dbms_output.put_line('Max deal '||to_char(v_salary));
end;

 

笔者在日常使用中常用的为方法二。

 

 

 

 

1
1
分享到:
评论

相关推荐

    Oracle Exception汇总(自定义Oracle异常)

    When no_data_found then Dbms_output.put_line(‘no_data_found’); ACCESS_INTO_NULL 为对象赋值前必需初始化对象。对应ORA-06530错误。 CASE_NOT_FOUND 使用CASE语句时在WHEN子句中没有包含必需的条件分支,...

    oracle恢复工具-FY_Recover_Data

    15:33:44: 1033 truncated data blocks found. 15:33:44: 72622 records recovered in backup table SYS.TRUNTAB1$$2 15:33:44: Recovery completed. PL/SQL procedure successfully completed 从红色字体可以...

    Oracle_存储过程的基本语法

    将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;...

    oracle存储过程语法

    BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN SELECT col1,...

    oracle存储过程

    记录,否则抛出异常(如果没有记录抛出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 ...

    oracle知识点及常用技术

    2,when no_data_found then 3 number(6,2)位数,保留小数位数 4 exec =call(包)函数 5create or replace trigger update_cascade after update of deptno on dept --update of deptno for each row declare -- ...

    Oracle8i_9i数据库基础

    §14.2.4 关于NO_DATA_FOUND和%NOTFOUND 260 §14.2.5 SELECT FOR UPDATE 光标 261 §14.3 光标变量 262 §14.3.1 声明光标变量 262 §14.3.2 为光标变量分配存储空间 262 §14.3.3 打开光标变量 262 §14.3.4 关闭...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...

    oracle实验报告

    when no_data_found then dbms_output.put_line(‘查无此人”); end; 3、 通过dept表查询出所有部门号,对每个部门雇员的工资进行调整,将工资高于(包含$2000)$2000的雇员每人增加$500,将工资低于$2000的雇员每人...

    全面解析Oracle Procedure 基本语法

    关键字: oracle 存储过程 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ... 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)  例子: BEGIN SELECT col1,col2 into 变量1,变量2 FROM typ

    ora10g客户端

    (DESCRIPTION=(ADDRESS=(PROTOCOL=BEQ)(PROGRAM=oracle)(ARGV0=oracleORCL)(ARGS='(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))'))(CONNECT_DATA=(SID=ORCL)(CID=(PROGRAM=D:\oracle\ora10g\sqlplus.exe)...

    oracle 存储过程的基本语法

    1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; ...END 存储过程名字 ... 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)

    Oracle Max函数使用中出现的问题

    DATE) INTO V_RE_DATE FROM T_RECORDING WHERE ID =’100010010102′ 按理说,根据这个条件查询的结果应该为sqlcode=1403 ,但是奇怪的是如下sql异常却捕获不到: 代码如下: EXCEPTION WHEN NO_DATA_FOUND THEN NULL;...

    oracle truncate恢复

    CLUSTER C_USER# file_no: 1 block_no: 177 TABLE OBJ$ file_no: 1 block_no: 241 CLUSTER C_OBJ# file_no: 1 block_no: 49 CLUSTER C_OBJ# file_no: 1 block_no: 49 found IND$’s obj# 19 found IND$’s dataobj#:...

    Oracle存储过程入门学习基本语法

    BEGIN END 存储过程名字 2.select INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN select col1,col...

    raiser:raiser是一个PLSQL错误管理器。 筹集者通过其插件功能利用OraOpenSource记录器实用程序的一部分所开发的功能非常丰富的功能

    提升程序允许您使用Oracle规定SQLCODE错误范围之外的错误范围(-20000至-20999)-您可以使用任何正整数,但100除外,因为这是Oracle NO_DATA_FOUND异常。 为了使您的错误代码返回到调用应用程序,您选择的错误编号...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    Exception When No_Data_Found Then Execute Immediate 'Create Sequence SYS_RAND_ID minvalue 1 maxValue 99999999999999999 Start With 1 increment by 1 cache 5 cycle order'; End; / --1、创建类型 Create ...

    OraclePLSQL编程经典例子

    8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。 过程 过程用于执行特定的操作,当执行过程的...

    关于oracle存储过程的基本语法

    在oracle中,数据表别名不能加as;在存储过程中,select某...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常;在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错

Global site tag (gtag.js) - Google Analytics