使用Postgresql的嵌套游标

使用Postgresql的嵌套游标,postgresql,cursor,plpgsql,Postgresql,Cursor,Plpgsql,我需要有关postgresql嵌套游标代码的帮助 我的计划是使用外部游标从表中获取数据行,并使用另一个表EventLog_Staging中的条件评估每一行。在计算每一行之后,我将结果插入到一个EventLog_Main表中 问题是,我正在从第一个游标返回的记录中传递列的值,但我的INSERT语句无法识别它 -创建事件日志的游标代码块 运行代码时出错: **********错误********** 错误:记录记录没有字段tbl列 上下文:SQL语句选择concat'INSERT INTO Even

我需要有关postgresql嵌套游标代码的帮助

我的计划是使用外部游标从表中获取数据行,并使用另一个表EventLog_Staging中的条件评估每一行。在计算每一行之后,我将结果插入到一个EventLog_Main表中

问题是,我正在从第一个游标返回的记录中传递列的值,但我的INSERT语句无法识别它

-创建事件日志的游标代码块

运行代码时出错:

**********错误**********

错误:记录记录没有字段tbl列

上下文:SQL语句选择concat'INSERT INTO EventLog\u Main 案例id、活动、生命周期、时间戳 值',rec_tbls.hadm_id',',',tbl_列',',',生命周期',',rec_tbls.tbl_列';'

PL/pgSQL函数内联\u代码\u块赋值处的第47行

**********错误**********


我了解tbl_列在入学表中不作为列存在。但是,tbl_列的值包含表中的列名。我需要帮助如何使用该参数从rec_tbls记录中获取值。谢谢。如果您在循环中的外部游标中多次打开内部游标,那么您将在循环中手动执行内部联接,而不是使用一个带有内部联接的SQL查询。这是一种代码气味和反模式-您的过程将非常缓慢。我建议你扔掉这段代码,从头开始。使用简单联接执行单个选择,并使用insert插入结果。。。选择声明。谢谢krokodilko,我该怎么做呢?对我来说,似乎只需在EventLog\u Main case\u id、activity、lifecycle、time\u stamp SELECT中插入一次就可以做到这一点。。。从EventLog_登台参加招生广告????其中eventrole='Event';我不清楚入学和事件记录之间的关系。我认为最好是为有问题的表发布完整的CREATETABLE语句、一些示例数据以及基于这些数据的预期结果。您还尝试将列名table\u column的值放入名为time\u stamp的列中。这可能是一个错误,或者您有非常奇怪的命名约定。我知道tbl_列在Admissions表中不作为列存在。但是,tbl_列的值包含表中的列名。我需要帮助如何使用该参数从rec_tbls记录中获取值。谢谢。如果您在循环中的外部游标中多次打开内部游标,那么您将在循环中手动执行内部联接,而不是使用一个带有内部联接的SQL查询。这是一种代码气味和反模式-您的过程将非常缓慢。我建议你扔掉这段代码,从头开始。使用简单联接执行单个选择,并使用insert插入结果。。。选择声明。谢谢krokodilko,我该怎么做呢?对我来说,似乎只需在EventLog\u Main case\u id、activity、lifecycle、time\u stamp SELECT中插入一次就可以做到这一点。。。从EventLog_登台参加招生广告????其中eventrole='Event';我不清楚入学和事件记录之间的关系。我认为最好是为有问题的表发布完整的CREATETABLE语句、一些示例数据以及基于这些数据的预期结果。您还尝试将列名table\u column的值放入名为time\u stamp的列中。这不是一个错误,就是您有非常奇怪的命名约定。
DO
$Event_Log_Creation_Code$
DECLARE
    rec_tbls RECORD;
    schem_name VARCHAR(100) := 'mimiciii';
    set_SrchPath text;
    tx text;
    tbl_name VARCHAR(50);
    tbl_column VARCHAR(50);
    col_datatype VARCHAR(50);
    event_role VARCHAR(50);
    life_cycle VARCHAR(50);

    csr_outer_create_evnt_log REFCURSOR; --Cursor to get the data from the main table
    csr_innner_create_evnt_log REFCURSOR; --Cursor to dissect each row of the main table    

    sql_eventlog_stge_rows text := 'SELECT tablename, columnname, datatype, eventrole, lifecycle 
            FROM EventLog_Staging  
            WHERE eventrole IS NOT NULL;';

    sql_table_rows text := 'Select * from admissions;';

   BEGIN

        -- Setting the search path to the specified db schema
        set_SrchPath := concat('SET search_path TO ',schem_name,';');
        EXECUTE set_SrchPath;


        -- Opening the outer cursor
        OPEN csr_outer_create_evnt_log FOR EXECUTE sql_table_rows;
        LOOP
            --Fetch rows into the specified fields
            FETCH csr_outer_create_evnt_log INTO rec_tbls; 
            EXIT WHEN NOT FOUND;  

            -- Create inner cursor
            OPEN csr_innner_create_evnt_log FOR EXECUTE sql_eventlog_stge_rows;

            -- Opening the inner Loop
            LOOP 
                --Fetch rows into the specified fields
                FETCH csr_innner_create_evnt_log INTO tbl_name, tbl_column, col_datatype, event_role, life_cycle; 
                EXIT WHEN NOT FOUND;       

                IF event_role = 'Event' THEN

                    tx :=concat('INSERT INTO EventLog_Main (case_id, activity, lifecycle, time_stamp)
                VALUES (',rec_tbls.hadm_id,',''',tbl_column,''',''',life_cycle,''',',rec_tbls.tbl_column,');');

                    EXECUTE tx;

                END IF;    

            --Closing the inner Loop            
            END LOOP;

            --Closing the inner cursor
            CLOSE csr_innner_create_evnt_log;

        --Closing the outer Loop            
        END LOOP;

        --Closing the outer cursor
        CLOSE csr_outer_create_evnt_log;

END $Event_Log_Creation_Code$;