`

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恢复工具-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 Exception汇总(自定义Oracle异常)

    为了避免程序中断,可以使用`EXCEPTION WHEN NO_DATA_FOUND THEN`来捕获并处理这个异常。 2. **TOO_MANY_ROWS** (ORA-01422): 当`SELECT INTO`语句返回多于一行数据时,会出现此异常。在处理时,通常需要修改查询以...

    ORACLE PL_SQL中的例外处理初探 (1).pdf

    在`EXCEPTION`部分,可以处理系统预定义的异常,如`NO_DATA_FOUND`(尝试访问不存在的数据时抛出)和`SQL_NOT_FOUND`(如UPDATE或DELETE语句没有影响任何行时抛出),也可以处理用户自定义的异常。当发生异常时,...

    Oracle_PLSQL.rar_Java plsql_oracle_oracle doc_pl sql_plsql

    - **内置异常**:如NO_DATA_FOUND、TOO_MANY_ROWS等,对应特定的错误情况。 - **自定义异常**:可以创建和抛出自定义异常,提供更精细的错误处理。 - **EXCEPTION部分**:在PL/SQL块中,异常处理部分捕获并处理...

    oralce异常信息对照表

    预定义异常是Oracle系统预先定义好的,它们与SQL语句执行过程中可能遇到的错误相对应,如NO_DATA_FOUND(试图访问不存在的数据)、TOO_MANY_ROWS(SQL查询返回多于一行数据)等。用户自定义异常则由开发人员根据具体...

    Oracle_PL_SQL经典练习题.docx

    方法一是通过分别选择`DEPTCP.LOC`和`DEPTCP.DNAME`到变量中,然后在`NO_DATA_FOUND`异常处理中提供错误消息。方法二是使用`DEPT%ROWTYPE`声明一个记录变量,将整行数据一次性检索到变量中。 3. 第三个练习利用了`%...

    oracle自定义异常

    Oracle PL/SQL支持多种类型的异常,包括预定义异常(如`DUP_VAL_ON_INDEX`、`NO_DATA_FOUND`、`TOO_MANY_ROWS`等)和用户自定义异常。 #### 二、预定义异常介绍 - **DUP_VAL_ON_INDEX**:当试图插入一个重复键值到...

    Oracle_存储过程exception异常处理大全及实例经典最终.docx

    例如,当尝试访问不存在的行时会触发 `NO_DATA_FOUND` 异常;当试图插入超出字段长度的数据时会触发 `VALUE_TOO_LARGE_FOR_COLUMN` 异常等。对于这类异常,开发人员无需手动定义,可以直接在程序中使用它们。 #### ...

    oracle_存储过程的基本语法_及注意事项

    需要注意的是,如果查询结果为空或返回多行数据,则会抛出异常(分别为`NO_DATA_FOUND`和`TOO_MANY_ROWS`)。 **示例代码**: ```sql DECLARE 变量1 NUMBER; 变量2 DATE; BEGIN SELECT col1, col2 INTO 变量1, ...

    Oracle 存储过程异常处理.docx

    Oracle 提供了预定义的内部异常,如 SELECT INTO 语句不返回行时产生的 NO_DATA_FOUND 异常、除数为零的 ZERO_DIVIDE 异常等。对于预定义异常,现将最常用的异常列举如下: * NO_DATA_FOUND(ORA-01403):SELECT ...

    oracle存储过程语法

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

    oracle异常及触发器.pptx

    预定义异常是 Oracle 提供的预定义错误类型,例如 Invalid_cursor、Cursor_already_open、No_data_found、Too_may_rows、Invalid_number 等。这些异常可以直接使用,不需要声明。 用户定义异常需要程序员自己定义...

    Oracle_10g_plsql实战笔记.doc

    - 使用 `EXCEPTION` 来处理 `NO_DATA_FOUND` 异常情况。 #### 七、总结 PL/SQL 是 Oracle 数据库的重要组成部分,它提供了丰富的编程功能,使得开发者能够在数据库内部编写复杂的应用逻辑。通过学习 PL/SQL 的基础...

    ORACLE游标与异常处理

    在Oracle数据库中,游标(Cursor)和异常处理(Exception Handling)是PL/SQL编程的重要组成部分,它们在处理复杂逻辑和确保数据完整性方面起到关键作用。以下是对这两个主题的详细阐述。 首先,让我们来理解Oracle...

    Oracle_存储过程的基本语法

    DBMS_OUTPUT.PUT_LINE('No data found.'); WHEN TOO_MANY_ROWS THEN -- 处理返回多条记录的情况 DBMS_OUTPUT.PUT_LINE('Too many rows returned.'); END; / ``` #### 3.1.3 IF 判断 `IF` 语句用于根据条件执行...

    Oracle_plsql编程1

    在这个例子中,`DECLARE`部分定义了一个变量`v_salary`,`BEGIN`和`END`之间的部分是执行代码,`EXCEPTION`部分处理可能出现的`NO_DATA_FOUND`异常。 PL/SQL的实例还包括使用`DBMS_OUTPUT.PUT_LINE`来输出信息,...

    Oracle PLSQL入门知识.doc

    预定义异常是Oracle已经定义好的异常,如NO_DATA_FOUND和TOO_MANY_ROWS。自定义异常则允许开发者创建特定的异常情况,例如: ```sql DECLARE BAD_ROWID EXCEPTION; X ROWID; PRAGMA EXCEPTION_INIT(BAD_ROWID, -...

Global site tag (gtag.js) - Google Analytics