Oracle PLSQL运行时已知列名如何从row_type变量获取数据
问题原因
- PL/SQL中
%ROWTYPE类型变量的列属性访问是静态编译的,你写的r1.col_name会被编译器识别为要访问r1中名为col_name的列,而不会把它替换为你传入的col_name变量的值,所以原有逻辑无法执行。 - 你之前尝试动态SQL没成功,大概率是没有处理行变量和动态列名的匹配逻辑。
可行解决方案
推荐用XML转换的方式实现,无需复杂的DBMS_SQL调用,代码更简洁易读:
declare CURSOR c IS SELECT * FROM table1; r1 c%ROWTYPE; function func_conv(col_name varchar2) return number is v_row_xml xmltype; v_col_val varchar2(4000); begin -- 把行变量转成XML格式 v_row_xml := xmltype(r1); -- 从XML中提取对应列的值 select extractvalue(v_row_xml, '/ROW/'||upper(col_name)) into v_col_val from dual; if v_col_val is null then return 1; else return 0; end if; exception when no_data_found then -- 列名不存在的情况兜底 return null; end; begin for s in (SELECT * from table1) LOOP r1 := s; dbms_output.put_line(func_conv('record_date')); end loop; end; /
注意事项
- 你原有代码中
returns是语法错误,Oracle PL/SQL的函数返回值声明用return而非returns - 如果你的表有大字段、特殊类型列,可能需要调整XML转换的逻辑,普通字符、数字、日期类型都可以直接用上面的代码
- 如果要性能更高,也可以用
DBMS_SQL包实现动态列值获取,但代码复杂度会高很多,常规场景下XML方案足够使用
内容的提问来源于stack exchange,提问作者Priyaranjan Swain
相关产品推荐
相关产品推荐

