SELECT查出多行 INTO 单行上会把第一行赋值到单行上

--关于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

相关文章
相关标签/搜索