【问题标题】:PLSQL : Dynamic table record holderPLSQL : 动态表记录持有者
【发布时间】:2012-11-14 17:53:09
【问题描述】:

如果我想从表中获取记录(表名是动态的输入),如何定义记录持有者或如何从这个定义的表中获取数据? 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
    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;

【问题讨论】:

  • 我认为不可能创建动态记录类型。可能有一种完全不同且更好的方法可以让您获得想要的结果。您希望程序输出什么?我认为这与两个输出参数有关。
  • @Jeremy 我只想从表中取出所有数据。这两个输出参数只是用来检查数据是否被正确检索。
  • 数据获取后会去哪里?是不是有一些你想对数据做的工作,不按照步骤从表中取出所有行似乎毫无意义。
  • @Jeremy 好的,我想验证数据是否以例外格式插入。但这里的重点是先获取数据。

标签: dynamic plsql cursor


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 2017-04-24
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多