Dynamic PLSQL:动态表记录保持器
如果我想从表中获取记录(表名是动态输入的),如何定义记录持有者或如何从定义的表中获取数据p_table_name%rowtype将不兼容,因为p_table_name是一个参数,而不是表名Dynamic PLSQL:动态表记录保持器,dynamic,plsql,cursor,Dynamic,Plsql,Cursor,如果我想从表中获取记录(表名是动态输入的),如何定义记录持有者或如何从定义的表中获取数据p_table_name%rowtype将不兼容,因为p_table_name是一个参数,而不是表名 PROCEDURE do_scan(p_table_name IN VARCHAR2 ,p_min_num IN NUMBER ,p_time_range IN NUMBER ,p_problem_desc OUT ,p_result_code OUT) IS TYP
PROCEDURE do_scan(p_table_name IN VARCHAR2
,p_min_num IN NUMBER
,p_time_range IN NUMBER
,p_problem_desc OUT
,p_result_code OUT)
IS
TYPE ObjCurTyp IS REF CURSOR;
v_obj_cursor ObjCurTyp;
v_obj_record ???????(p_table_name%rowtype)
BEGIN
v_stmt_str := 'Select * from :t where date_started > TRUNC(SYSDATE-3)';
OPEN v_obj_cursor FOR v_stmt_str USING p_table_name;
LOOP
FETCH v_obj_cursor INTO v_obj_record;
EXIT WHEN v_obj_cursor %NOTFOUND;
END LOOP;
END do_scan;
您可以将该代码作为动态PL/SQL块放在EXECUTE IMMEDIATE语句中
PROCEDURE do_scan
(
p_table_name IN VARCHAR2
p_min_num IN NUMBER
p_time_range IN NUMBER
p_problem_desc OUT
p_result_code OUT
)
IS
BEGIN
EXECUTE IMMEDIATE
'DECLARE ' ||
' TYPE ObjCurTyp IS REF CURSOR; ' ||
' v_obj_cursor ObjCurTyp; ' ||
' v_obj_record ' || p_table_name || '%rowtype; '||
'BEGIN ' ||
' v_stmt_str := ''Select * from :t where ' ||
' date_started > TRUNC(SYSDATE-3)''; ' ||
' OPEN v_obj_cursor ' ||
' FOR v_stmt_str USING ' ||
p_table_name || '; ' ||
' LOOP ' ||
' FETCH v_obj_cursor INTO v_obj_record; ' ||
' EXIT WHEN v_obj_cursor %NOTFOUND; ' ||
' END LOOP; ' ||
'END;';
END do_scan;
问候,
Dariyoosh我认为不可能创建动态记录类型。也许有一种完全不同的更好的方法可以让你得到你想要的结果。您希望过程输出什么?我假设它与两个输出参数有关。@Jeremy我只想从表中取出所有数据。这两个输出参数只是用来检查数据是否被正确地检索到。一旦数据被检索到,数据会去哪里?您是否需要对数据进行一些处理,从表中提取所有行而不执行以下步骤似乎毫无意义。@Jeremy好的,我想验证数据是否以例外格式插入。但这里的关键点是首先获取数据。