Oracle PLSQL中如何通过SELECT查询为变量赋值多个值
Oracle PL/SQL中使用SELECT语句为变量赋多个值的方法
你给出的示例Select * into v_name from tbl_name;是PL/SQL里SELECT INTO赋值的基础写法,但默认语法只能处理单行查询结果,要给变量赋多个值,需要根据查询返回的结果场景选对应写法:
单行多列赋值
如果查询最终只会返回1行数据,但包含多个字段值,只需要在INTO后面按查询字段的顺序、类型,对应放相同数量的变量接收即可;嫌逐个定义变量麻烦的话,也可以直接用%ROWTYPE锚定表结构定义记录变量,一次性接整行的所有字段。
示例:
DECLARE -- 用emp表的行类型定义变量,自动匹配表中所有字段的类型、长度 v_single_emp emp%ROWTYPE; BEGIN SELECT emp_id, emp_name, salary, hire_date INTO v_single_emp.emp_id, v_single_emp.emp_name, v_single_emp.salary, v_single_emp.hire_date FROM emp WHERE emp_id = 1001; -- 后续直接通过 变量名.字段名 就能取到对应值,比如DBMS_OUTPUT.PUT_LINE(v_single_emp.emp_name); END; /
注意:不带批量收集的普通
SELECT INTO要求查询结果必须恰好是1行,返回0行会抛NO_DATA_FOUND异常,返回超过1行会抛TOO_MANY_ROWS异常,写的时候一定要加好过滤条件确认返回行数。
多行结果赋值
如果查询会返回1行以上的结果,普通变量存不下,需要搭配BULK COLLECT关键字,把结果批量存入集合类型变量,一次性接收所有符合条件的多值。
示例:
DECLARE -- 定义基于emp行类型的嵌套表集合类型 TYPE t_emp_list IS TABLE OF emp%ROWTYPE; -- 声明集合变量存多行数据 v_emps t_emp_list; BEGIN SELECT * BULK COLLECT INTO v_emps FROM emp WHERE dept_id = 20; -- 遍历集合就能逐行读取所有存下来的值 FOR i IN 1 .. v_emps.COUNT LOOP DBMS_OUTPUT.PUT_LINE('第'||i||'个员工:'||v_emps(i).emp_name||',工资:'||v_emps(i).salary); END LOOP; END; /
如果查询结果集特别大,别用BULK COLLECT一次性把所有数据加载到内存,容易撑爆会话内存,这种场景建议用显式游标逐行拉取赋值就好。另外日常开发尽量不要图省事直接写SELECT *赋值,表结构变动的时候很容易出现字段数量、类型不匹配的报错,最好明确写清楚需要查询的字段列表。
内容的提问来源于stack exchange,提问作者Naveed Ul Islam
相关产品推荐
相关产品推荐

