declare
-- Local variables here
i integer;
v_sql_str varchar(1000); --动态sql
v_sql_par varchar(10); --动态sql条件参数
v_cur number; --动态游标定义
row_process number;
v_column_name varchar(40); --动态sql获得的列值1
v_column_status number;
--定义数组
type name_type is table of varchar2(40) index by binary_integer;
type status_type is table of number index by binary_integer;
TempName name_type; --名称
TempStatus status_type; --状态
begin
i := 1;
v_sql_par := '101';
v_sql_str := 'select real_name, agent_status from t_agent a where a.organ_id = ' ||
v_sql_par;
v_cur := dbms_sql.open_cursor; --打开游标
dbms_sql.parse(v_cur, v_sql_str, dbms_sql.native); --对动态sql做解析
dbms_sql.define_column(v_cur, 1, v_column_name, 40); --定义动态游标所能得到的值
dbms_sql.define_column(v_cur, 2, v_column_status); --定义动态游标所能得到的值
row_process := dbms_sql.execute(v_cur); --执行游
loop
--对游标进行循环取数, 为0时表示取到游标末端
if dbms_sql.fetch_rows(v_cur) > 0 then
dbms_sql.column_value(v_cur, 1, v_column_name); --将所取得的游标数据赋值到相应的变量
dbms_sql.column_value(v_cur, 2, v_column_status); --将所取得的游标数据赋值到相应的变量
TempName(i) := v_column_name; --将取到的名称存入数组中
TempStatus(i) := v_column_status; --将取到的状态存入数组中
i := i + 1;
--dbms_output.put_line(v_column_name || '-----' || v_column_status);
else
exit;
end if;
end loop;
if dbms_sql.is_open(v_cur) then
--判断动态游标是否打开
dbms_sql.close_cursor(v_cur); --关闭动态游标
end if;
exception
when others then
dbms_output.put_line(sqlerrm);
for j in 1 .. i loop
dbms_output.put_line(TempName(j) || '--' || TempStatus(j));
end loop;
end;