Josber
25 de mayo de 2026, 10:39
Haciendo una búsqueda específica el otro día, encontré Éste Post (https://www.cobolforo.es/showthread.php?t=332), en el que decíamos que con SQL Embebido, sólo se pueden usar las instrucciones que tenga el Precompilador de SQL, como referencia para todos los usuarios, se puede usar CASI cualquier sentencia que necesitemos, (no sé si todas, pero sí puedo decir que todas las que he necesitado sí se puede). La forma es muy simple, montar un STRING a una variable, hacer un PREPARE y después un EXECUTE
Por ejemplo, para crear una tabla, que en el post de referencia, no sabíamos como hacerlo:
INITIALIZE SQL_CMD.
STRING "CREATE TABLE IF NOT EXIST `Alphas` ( "
"`ALPCOD` CHAR(2) NOT NULL COLLATE 'utf8mb4_uca1400_spanish_ai_cs', "
"`ALPDES` CHAR(30) NULL DEFAULT NULL COLLATE 'utf8mb4_uca1400_spanish_ai_cs', "
"PRIMARY KEY (`ALPCOD`) USING BTREE "
") "
"COMMENT='Series Alpha' "
"COLLATE='utf8mb4_uca1400_spanish_ai_cs' "
"ENGINE=InnoDB; " DELIMITED BY SIZE INTO SQL_CMD
END-STRING.
EXEC SQL
PREPARE S1 FROM :SQL_CMD
END-EXEC.
EXEC SQL
EXECUTE S1
END-EXEC.
o, para vaciar una tabla
INITIALIZE SQL_CMD.
MOVE "TRUNCATE TABLE implin" TO SQL_CMD.
EXEC SQL
PREPARE S1 FROM :SQL_CMD
END-EXEC.
EXEC SQL
EXECUTE S1
END-EXEC.
Mientras se pueda hacer con un PREPARE/EXECUTE, colará la instrucción. Sólo hay que tener en cuenta una cosa, y es que si controláis los errores de SQLSTATE, si la sentencia SQL no devuelve ningún dato, devolverá SIEMPRE el error [02000] [No data is found], eso es porque éste tipo de sentencia, espera que se devuelva algún dato de retorno, pero no es nada, la instrucción se ejecuta perfectamente, por cierto, no es necesario un COMMIT después.
Por lo menos ya podemos ejecutar el 99% de las sentencias sql.
Un salu2 a tod@s
P.D.: mis pruebas, están basadas en MariaDB v.12
Por ejemplo, para crear una tabla, que en el post de referencia, no sabíamos como hacerlo:
INITIALIZE SQL_CMD.
STRING "CREATE TABLE IF NOT EXIST `Alphas` ( "
"`ALPCOD` CHAR(2) NOT NULL COLLATE 'utf8mb4_uca1400_spanish_ai_cs', "
"`ALPDES` CHAR(30) NULL DEFAULT NULL COLLATE 'utf8mb4_uca1400_spanish_ai_cs', "
"PRIMARY KEY (`ALPCOD`) USING BTREE "
") "
"COMMENT='Series Alpha' "
"COLLATE='utf8mb4_uca1400_spanish_ai_cs' "
"ENGINE=InnoDB; " DELIMITED BY SIZE INTO SQL_CMD
END-STRING.
EXEC SQL
PREPARE S1 FROM :SQL_CMD
END-EXEC.
EXEC SQL
EXECUTE S1
END-EXEC.
o, para vaciar una tabla
INITIALIZE SQL_CMD.
MOVE "TRUNCATE TABLE implin" TO SQL_CMD.
EXEC SQL
PREPARE S1 FROM :SQL_CMD
END-EXEC.
EXEC SQL
EXECUTE S1
END-EXEC.
Mientras se pueda hacer con un PREPARE/EXECUTE, colará la instrucción. Sólo hay que tener en cuenta una cosa, y es que si controláis los errores de SQLSTATE, si la sentencia SQL no devuelve ningún dato, devolverá SIEMPRE el error [02000] [No data is found], eso es porque éste tipo de sentencia, espera que se devuelva algún dato de retorno, pero no es nada, la instrucción se ejecuta perfectamente, por cierto, no es necesario un COMMIT después.
Por lo menos ya podemos ejecutar el 99% de las sentencias sql.
Un salu2 a tod@s
P.D.: mis pruebas, están basadas en MariaDB v.12