Thread: ecpg "problem" ...
if (ic_flag == 1) { /*only select those non-IC/Spyder nodes that has full update set*/ EXEC SQL DECLAREfull_dyn_node CURSOR FOR SELECT node_name FROM NODE WHERE dynamic_community = 'f' ANDic_flag='n' AND machine_type!=22 AND node_id != 0 AND NODE_NAME != :nodename; } else{ EXEC SQL DECLARE full_dyn_node CURSOR FOR SELECT node_name FROM NODE WHERE dynamic_community= 'f' AND node_id != 0 AND NODE_NAME != :nodename; (line#493) } the above code generates the following error: The compiler complains: ../subapi.pgc:493: ERROR: cursor full_dyn_node already defined since its envelop'd in an if/else clause, shouldn't it work?
hi, i think that ecpg is only text preprocessor. it doesn't understand the c semantics - it goes from the top to the end of the file row by row and sees your declaration twice. kuba On Tue, 12 Nov 2002, Marc G. Fournier wrote: > > > if (ic_flag == 1) { > /*only select those non-IC/Spyder nodes that has full update set*/ > EXEC SQL DECLARE full_dyn_node CURSOR FOR > SELECT node_name FROM NODE > WHERE dynamic_community = 'f' AND ic_flag='n' AND machine_type!=22 > AND node_id != 0 AND NODE_NAME != :nodename; > } > else{ > EXEC SQL DECLARE full_dyn_node CURSOR FOR > SELECT node_name FROM NODE > WHERE dynamic_community = 'f' > AND node_id != 0 AND NODE_NAME != :nodename; (line#493) > } > > the above code generates the following error: > > The compiler complains: > ../subapi.pgc:493: ERROR: cursor full_dyn_node already defined > > since its envelop'd in an if/else clause, shouldn't it work? > > > > > ---------------------------(end of broadcast)--------------------------- > TIP 3: if posting/reading through Usenet, please send an appropriate > subscribe-nomail command to majordomo@postgresql.org so that your > message can get through to the mailing list cleanly >
Marc, Marc G. Fournier writes:> if (ic_flag == 1) {> /*only select those non-IC/Spyder nodes that has full updateset*/> EXEC SQL DECLARE full_dyn_node CURSOR FOR> SELECT node_name FROM NODE> WHERE dynamic_community = 'f' AND ic_flag='n' AND machine_type!=22> AND node_id != 0 AND NODE_NAME!= :nodename;> }> else{> EXEC SQL DECLARE full_dyn_node CURSOR FOR> SELECTnode_name FROM NODE> WHERE dynamic_community = 'f'> AND node_id != 0 AND NODE_NAME!= :nodename; (line#493)> }> > the above code generates the following error:> > The compiler complains:>../subapi.pgc:493: ERROR: cursor full_dyn_node already defined> > since its envelop'd in an if/else clause, shouldn'tit work? Unfortuantely no, you can only ever have one "EXEC SQL DECLARE" for a given cursor name due to ecpg/ESQL simple parsing. What you would do in a situation like this is something like: if( ic_flag == 1 ) /* only select those non-IC/Spyder nodes that has full update set */ sprintf(stmt, "SELECT node_nameFROM NODE WHERE dynamic_community = 'f' AND ic_flag = 'n' AND machine_type != 22 AND node_id != 0 AND NODE_NAME!= %s", nodename); else sprintf(stmt, "SELECT node_name FROM NODE WHERE dynamic_community = 'f' AND node_id !=0 AND NODE_NAME != %s", nodename); EXEC SQL PREPARE s_statement FROM :stmt; EXEC SQL DECLARE full_dyn_node CURSOR FOR s_statement; Regards, Lee.
On Tue, Nov 12, 2002 at 02:58:17PM -0400, Marc G. Fournier wrote: > > > if (ic_flag == 1) { > /*only select those non-IC/Spyder nodes that has full update set*/ > EXEC SQL DECLARE full_dyn_node CURSOR FOR > SELECT node_name FROM NODE > WHERE dynamic_community = 'f' AND ic_flag='n' AND machine_type!=22 > AND node_id != 0 AND NODE_NAME != :nodename; > } > else{ > EXEC SQL DECLARE full_dyn_node CURSOR FOR > SELECT node_name FROM NODE > WHERE dynamic_community = 'f' > AND node_id != 0 AND NODE_NAME != :nodename; (line#493) > } > ... > since its envelop'd in an if/else clause, shouldn't it work? By definition no. You could compare it to C preprocessor commands like #define. Michael -- Michael Meskes Michael@Fam-Meskes.De Go SF 49ers! Go Rhein Fire! Use Debian GNU/Linux! Use PostgreSQL!