La Web del Programador: Comunidad de Programadores
 
    Pregunta:  54146 - DELETE FROM TABLA_DINAMICA WHERE CURRENT OF CURSOR
Autor:  Ignacio Fatou Castro
Hola estoy trabajando en C y tengo una duda.
Actualmente estoy recorriendo un cursor que he creado de forma dinámica, y necesitaría borrar uno a uno los registros del cursos tal y como se van leyendo. El problema concretamente es que lo del CURRENT OF Cursor funciona cuando pongo el nombre de la tabla, pero cuando el nombre de la tabla tengo que asignarla en código no funciona.

Ejemplo del cursor:
-------------------------------------------
sprintf(lszQuery,"SELECT * FROM %s",lszTabla);
EXEC SQL
PREPARE CursorDinTab FROM :lszQuery;
EXEC SQL
DECLARE CursorDin CURSOR FOR CursorDinTab;
EXEC SQL
OPEN CursorDin;
----------------------------------------------

Declaro El Cursor de borrado

sprintf(lszDelete,"DELETE FROM %s WHERE CURRENT OF CursorDin",lszTabla);
EXEC SQL
PREPARE CursorDelete FROM :lszDelete;

Es aquí donde me fallaría y no estoy seguro de que es lo que estoy haciendo mal.

No se si hay otra manera de ir borrando uno a uno los datos de una tabla cuyo nombre desconozco.

Un saludo y gracias por vuestro tiempo.

  Respuesta:  LuFer Vega
Bueno, no se si todavia te sirva pero yo haria el borrado masivo de todos los registros y no de uno en uno, aqui te dejo un metodo que hace lo que tu quieres:

char *E_cpNombreTabla, Nombre de La Tabla que vas a eliminar los Registros.
char *E_cpCampoLLave, Campo Llave de la Tabla
char *M_cpMSJErr, Cadena donde se almacenara el Mensaje de Error en caso de que ocurriera alguno.

Valores de Retorno: 0 en caso de Exito. Cualquier otro en caso de Error.

#define Delete_Regs "DELETE FROM %s WHERE %s IN (SELECT %s FROM %s)"
int iBorrarDatos(char *E_cpNombreTabla, char *E_cpCampoLLave, char *M_cpMSJErr)
{
short sResult = 0;
EXEC SQL BEGIN DECLARE SECTION;
char cSQLStatement[1024];
EXEC SQL END DECLARE SECTION;

sprintf(cSQLStatement, Delete_Regs, E_cpNombreTabla, E_cpCampoLLave, E_cpCampoLLave, E_cpNombreTabla);
EXEC SQL PREPARE p_Delete_Regs FROM :cSQLStatement;
EXEC SQL EXECUTE p_Delete_Regs;
if(sqlca.sqlcode != 0){
sResult = sqlca.sqlcode;
sprintf(M_cpMSJErr, sqlca.sqlerrm.sqlerrmc);
}
return sResult;
}

Si no te sirve o tienes alguna duda comunicate por
skype lfernandovegar
correo [email protected]