--关于SELECT INTO 一直以来的错误认知: --若是查出来多条数据,不只会抛出异常,并且会把第一行数据赋值上去,直接上例子sql
CREATE TABLE SELECT_INTO_TEST (T_ID NUMBER,T_NAME VARCHAR2(10),T_LOCATION VARCHAR2(50)); INSERT INTO SELECT_INTO_TEST SELECT 1,'RICK','AMERICAN' FROM DUAL UNION ALL SELECT 2,'SON','AMERICAN' FROM DUAL; COMMIT;
SELECT * FROM SELECT_INTO_TEST;
查询出结果为:code
--例子一:查出多条数据会自动填充第一行,因此输出为: ** V_ID=1V_NAME=RICKV_LOACTION=AMERICAN**图片
DECLARE V_ID NUMBER; V_NAME VARCHAR2(10); V_LOCATION VARCHAR2(50); BEGIN BEGIN SELECT T_ID,T_NAME,T_LOCATION INTO V_ID,V_NAME,V_LOCATION FROM SELECT_INTO_TEST; EXCEPTION WHEN OTHERS THEN NULL; END; DBMS_OUTPUT.PUT_LINE('V_ID='||V_ID||'V_NAME='||V_NAME||'V_LOACTION='||V_LOCATION); END;
--这样写才比较正确 :若是查出多条数据,抛出异常,清空表数据 DECLARE V_ID NUMBER; V_NAME VARCHAR2(10); V_LOCATION VARCHAR2(50); BEGIN BEGIN SELECT T_ID,T_NAME,T_LOCATION INTO V_ID,V_NAME,V_LOCATION FROM SELECT_INTO_TEST; EXCEPTION WHEN OTHERS THEN V_ID := NULL; V_NAME := NULL; V_LOCATION := NULL; END; DBMS_OUTPUT.PUT_LINE('V_ID='||V_ID||'V_NAME='||V_NAME||'V_LOACTION='||V_LOCATION); END;
总结: 以前一直认为若是查出多条 INTO 到单行上,会直接报错,赋值为空,这一直是一个认知错误,若是多条INTO到单行,会把第一行数据赋值上。 --因此须要再 EXCEPTION 中清空数据。it