Frank
Frank

Reputation: 1345

PLSQL : Dynamic table record holder

If I want to fetch records from a table (table name is dynamic from input), how to define the record holder or how to fetch the data from this defined table? p_table_name%rowtype will not complie because p_table_name is a parameter, not a 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
    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;

Upvotes: 0

Views: 1991

Answers (1)

dariyoosh
dariyoosh

Reputation: 614

You can put that code as a dynamic PL/SQL block within an EXECUTE IMMEDIATE statement.

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;

Regards,

Dariyoosh

Upvotes: 1

Related Questions