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