2012-11-14 45 views
0

如果我想從表中獲取記錄(表名是輸入的動態變量),如何定義記錄所有者或如何從這個定義的表中獲取數據? p_table_name%rowtype不會編譯,因爲p_table_name是一個參數,而不是表名。PLSQL:動態表記錄保存程序

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; 
+0

我不認爲它可以創建一個動態的記錄類型。可能會有一個完全不同的更好的方法來獲得你想要的結果。你想要什麼程序輸出?我認爲它與兩個輸出參數有關。 –

+0

@Jeremy我只想從表格中提取所有數據。這兩個輸出參數僅用於檢查數據是否正確檢索。 – Frank

+0

數據一旦被提取就會在哪裏?是不是有一些你想做的工作,從表中取出所有的行,沒有後續步驟似乎毫無意義。 –

回答

1

您可以將該代碼作爲動態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