• 解决Oracle报错ORA-01403: 未找到任何数据


    发现问题

    今天在执行某个存储过程的时候,遇到一个报错,提示我ORA-01403: 未找到任何数据
    如图所示
    在这里插入图片描述

    问题分析

    因为我的报错信息表里有记录着具体的报错位置,所以我很快的能够定位到问题所在,感觉这样找问题真的挺方便的,还是建议大家都把异常信息记录下来吧。
    在这里插入图片描述
    然后找到我的存储过程代码具体行
    在这里插入图片描述

    到这里差不多明白问题所在了,那是因为oracle中select into 语法不能将无结果集的数据赋值到变量中,比如我们写存储过程、函数、触发器等,假如有使用到select into,那就要想办法把一个空或者默认值赋值给变量,不然都会提示这个错误信息

    解决问题

    为了更好的模拟情况,我这边先创建一张空数据的测试表

    create table TEST_USER
    (
      name VARCHAR2(30),
      age  NUMBER(3)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    方案一

    先查询一遍看看有没有数据,再决定赋不赋值,但这种办法一般不推荐,比较啰嗦

    DECLARE
      row_count int;--记录行数
      v_name VARCHAR2(30);
      v_age int;
    BEGIN
      select count(1) into row_count from TEST_USER where id=1;
      --大于0代表有数据
      if row_count>0 then
        select name,age into v_name,v_age from TEST_USER where id=1;
      end if;
      DBMS_OUTPUT.PUT_LINE('v_name:'|| v_name || ', v_age: ' || to_char(v_age));
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    方案二

    利用dual表赋值,强烈推荐!!!

    DECLARE
      v_name VARCHAR2(30);
      v_age int;
    BEGIN
      -- 单字段赋值(适用: 只查一个字段、查询字段少且SQL短)
      SELECT (select name from TEST_USER where id=1) INTO v_name FROM DUAL;
      SELECT (select age from TEST_USER where id=1) INTO v_age FROM DUAL;
      DBMS_OUTPUT.PUT_LINE('v_name:'|| v_name || ', v_age: ' || to_char(v_age));
      -- 多字段赋值(使用: 查多个字段或SQL比较复杂)
      WITH TEMP AS (
        select name,age from TEST_USER where id=1
      )
      SELECT (SELECT name FROM temp),(SELECT age FROM temp) INTO v_name, v_age FROM dual;
    
      DBMS_OUTPUT.PUT_LINE('v_name:'|| v_name || ', v_age: ' || to_char(v_age));
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    总结

    赋值单字段或较少字段, SQL简单的情况,则可以采用单字段SQL赋值
    赋值较多字段或多字段, SQL复杂的情况, 则可以采用 WITH TEMP AS + DUAL赋值

  • 相关阅读:
    xilinx reset,data同步
    Java 可变参数及集合工具类(Collections)
    STM32CubeMX教程5 TIM 定时器概述及基本定时器
    SpringCloud-Gateway修改Response响应体,并解决大数据量返回不全等问题
    Java 设计模式——桥接模式
    【算法|动态规划No.10】leetcode LCR 089. 打家劫舍 & LCR 090. 打家劫舍 II
    轻量化网络 Mobilenet V1/V2/V3 学习记录
    I2C3挂载wm8960音频芯片
    【chrome扩展开发】消息通讯之onMessage消息监听
    EdgeX Foundry 边缘物联网中间件平台
  • 原文地址:https://blog.csdn.net/shaojiayong/article/details/126602597