我有一个表TestTable,其中包含col_test1,col_test2,col_test3 ...的列,并且我想创建一个循环,该循环分别访问这些列中的每一个,并找到最大值并将其放在声明块和简单dbms中创建的变量中。输出。
Declare
my_array sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll('col_test1','col_test2','col_test2');
v_test number(8,0);
Begin
for r in my_array.first..my_array.last
loop
select max(my_array(r)) into v_test from TestTable;
dbms_output.put_line(v_test);
end loop;
End;
/
我得到的输出只是字符串'col_test1',应为50。这是通过oracle SQL完成的。有什么办法可以做到这一点?
您可以为此使用动态SQL
Declare
my_array sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll('col_test1','col_test2','col_test2');
v_test number(8,0);
Begin
for r in my_array.first..my_array.last
loop
execute immediate 'select max(' || my_array(r) || ') from TestTable'
into v_test;
dbms_output.put_line(v_test);
end loop;
End;
但是,如果您要使用动态SQL,则通常更明智的做法是构建一个SQL语句,该语句max
一次通过所有三列的语句,而不是可能对同一张表进行三个单独的表扫描。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句