- v _ array 中 的 这些 列 有 计数 , 但是 当 我 运行 这 段 代码 时 , 它 对 所有 列 返回 零 计数 , 我 的 错误 在 哪里 , 请 帮助 我 - - - -
set serveroutput on
declare
type t_list is table of varchar(50) index by PLS_INTEGER;
r_emp t_list;
type e_list is varray(4) of varchar(50);
v_array e_list;
begin
v_array:=e_list('CLAIRTY_ID','SERV_ACCT_NUMBER','BB_ACQUISITION_TYPE','ONT_ACQ_TYPE');
for i in 1..4 loop
select sum(case when v_array(i) is null then 1 else 0 end) into r_emp(i) from SZ_GOODS_DETAIL;
dbms_output.put_line( r_emp(i));
end loop;
end;
--------------output--------------------
0
0
0
0
PL/SQL procedure successfully completed.
中 的 每 一 个
3条答案
按热度按时间wko9yo5t1#
您似乎在尝试计算集合中包含的每个列中的空值的数量。当您这样做时:
您正在计算表中 * 集合元素 *
v_array(i)
为空的行数--它要么总是为零(如果集合元素不为空,就像您的所有元素一样),要么是表中的行数(如果元素为空)。该元素是否为空与表中的数据无关。如果您要针对表格中的每一个数据列,评估与该收集要素值Map的数据栏值,则您必须使用下列方式来评估要素名称:
...这使得集合有点无意义,可能不是您所想的那样,或者使用动态SQL将元素值嵌入为列名:
循环的每次迭代都将构造并执行一个动态语句,如下所示:
...您可以在调试输出中看到它(一旦它工作,您显然可以删除它)。
您也可以使用
count()
进行计算,从数据列数中减去非Null值的数目:或者,您可以避免使用PL/SQL,而使用XML技巧:
fiddle
uqxowvwt2#
您希望得到什么结果?SZ_GOODS_DETAIL表与它有什么关系?我猜您希望将集合内容与存储在该表中的值进行比较,但是-您的代码没有这样做。
以下是我 * 认为 * 你想要的(不一定是真的):
表格内容:
修改程序(参见第19行):
结果:
t9eec4r03#
如果 要 使用 动态 列名 , 则 需要 使用 动态 SQL :
中 的 每 一 个
其中 , 对于 示例 数据 :
格式
输出 :
格式
fiddle 的 最 大 值