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;
笔者在日常使用中常用的为方法二。
相关推荐
When no_data_found then Dbms_output.put_line(‘no_data_found’); ACCESS_INTO_NULL 为对象赋值前必需初始化对象。对应ORA-06530错误。 CASE_NOT_FOUND 使用CASE语句时在WHEN子句中没有包含必需的条件分支,...
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 从红色字体可以...
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;...
BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN SELECT col1,...
记录,否则抛出异常(如果没有记录抛出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 ...
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 -- ...
§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 关闭...
Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...
when no_data_found then dbms_output.put_line(‘查无此人”); end; 3、 通过dept表查询出所有部门号,对每个部门雇员的工资进行调整,将工资高于(包含$2000)$2000的雇员每人增加$500,将工资低于$2000的雇员每人...
关键字: oracle 存储过程 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ... 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN SELECT col1,col2 into 变量1,变量2 FROM typ
(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)...
1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; ...END 存储过程名字 ... 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
DATE) INTO V_RE_DATE FROM T_RECORDING WHERE ID =’100010010102′ 按理说,根据这个条件查询的结果应该为sqlcode=1403 ,但是奇怪的是如下sql异常却捕获不到: 代码如下: EXCEPTION WHEN NO_DATA_FOUND THEN NULL;...
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#:...
BEGIN END 存储过程名字 2.select INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN select col1,col...
提升程序允许您使用Oracle规定SQLCODE错误范围之外的错误范围(-20000至-20999)-您可以使用任何正整数,但100除外,因为这是Oracle NO_DATA_FOUND异常。 为了使您的错误代码返回到调用应用程序,您选择的错误编号...
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 ...
8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。 过程 过程用于执行特定的操作,当执行过程的...
在oracle中,数据表别名不能加as;在存储过程中,select某...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常;在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错