create table mytable (
id number(2),
name varchar2(5))
--------------------------
DECLARE
flag NUMBER(2);
BEGIN
SELECT 1 INTO flag FROM mytable WHERE ID = 12;
IF flag = 1 THEN
dbms_output.put_line('记录12存在');
ELSE
dbms_output.put_line('记录12不存在');
END IF;
END;
这段匿名块可能报2个错误
ORA-01403: 未找到任何数据
ORA-06512: 在 line 4
当mytable记录真的不存在的时候,程序会抛出异常ORA-01403。
--------------------------
insert into mytable values(1,'andy');
--------------------------
再执行匿名块,输出"记录12存在"
重复插入记录
ID NAME
1 12 andy
2 12 andy
再执行匿名块,会报
ORA-01422: 实际返回的行数超出请求的行数
ORA-06512: 在 line 4
这是程序逻辑的一部分,不管在表mytable中是否能找到记录,都能给我一个明确的答复,然后程序继续执行下去。
为力规避上述2个常见错误
尝试一下方法:
1,使用函数
DECLARE
FLAG NUMBER(2);
BEGIN
SELECT MAX(1) INTO FLAG FROM MYTABLE WHERE ID = 12;
IF FLAG = 1 THEN
DBMS_OUTPUT.PUT_LINE('记录12存在');
ELSE
DBMS_OUTPUT.PUT_LINE('记录12不存在');
END IF;
END;
无记录时flag为空,有记录时只取一条;
2,使用异常处理
DECLARE
FLAG NUMBER(2);
BEGIN
SELECT 1 INTO FLAG FROM MYTABLE WHERE ID = 12;
IF FLAG = 1 THEN
DBMS_OUTPUT.PUT_LINE('记录12存在');
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('记录12不存在');
END;
3,有人提出判断记录存不存在,为何不直接用count;
因为特殊情况,我这里要判断的是一个日志表,里面不但要有数据,还要获得执行结果的状态码,是异常,还是执行成功,这个时候用count是不能达到预期效果。
SELECT INTO 是隐式游标,只能传一个内容进去
thanks here
http://www.itpub.net/thread-859456-1-1.html
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------
ORA-00918: 未明确定义列的错误
INSERT 时候 values 里的列不确定,常见于merge into后面的insert中。