Error en CREATE PROCEDURE desde aplicación
Sigo con mi "guerra particular" aprendiendo el uso de procedures y triggers. Estoy tratando de crear un procedure desde una aplicación. Este se el código:
Código:
String Codigo = "CREATE PROCEDURE Persona_Bor_Aux(iTabla VARCHAR(10), iProvincia CHAR(2)) AS DECLARE VARIABLE pCodigo VARCHAR(9); DECLARE VARIABLE pLike CHAR(12); DECLARE VARIABLE pSelect VARCHAR(250); BEGIN pCodigo = IIF(iTabla = 'CARGO' OR iTabla = 'PROFESION', 999999, 999); pLike = '%DESCONOCID%'; pSelect = 'SELECT Codigo FROM ' || iTabla || ' WHERE ' || IIF(iTabla = 'PAIS', '', 'CodPrv = :iProvincia AND ') || ' Nombre LIKE ' || pLike || ' INTO :pCodigo'; EXECUTE STATEMENT :pSelect; pSelect = 'UPDATE Personas SET ' || iTabla || ' = :pCodigo WHERE CodPrv = :iProvincia AND ' || iTabla || ' = :OLD.' || iTabla; EXECUTE STATEMENT :pSelect; END" Verifico que no exista. Código:
Auxiliar->Close(); Código:
if (Auxiliar->FieldByName("Hay")->AsInteger == 0) |
Una pregunta: ¿por qué quieres crear procedures en tiempo de ejecución?
No es "normal" ni "lógico", la estructura de la base de datos debe ser un entorno "cerrado" no modificable desde el exterior. |
Hola Angel.
En principio voy a decirte que estoy totalmente de acuerdo con Casimiro. Pero a modo ilustrativo, ya sea que uses un componente TIBSQL o un TIBQuery, tenes que fijar la propiedad ParamCheck en falso. Un ejemplo trivial: Código:
... |
Cita:
Cita:
|
Si es posible crear procedimientos almacenados / triggers desde una aplicación.
Particularmente creo triggers desde la aplicación para configurar trazos de auditoria, es decir, tengo una pantalla donde puedo seleccionar cualquier tabla de la base de datos y luego marcar que campos tendrán un trazo en una bitacora cuando se efectuen modificaciones. Para hacerlo debe respetarsen las partes que constituyen un procedimiento almacenado / trigger, como son: uso de set term, encabezado, cuerpo, finalizacion, particularmente utilizo componentes IBX y un Script. Colocas el objeto TIBScript en tu pantalla y lo conectas a la base de datos y a una transacción, el código puede ser más o menos así:
|
v:-)v Prueba rápida. Funcionó a la perfección. Muchísimas gracias a los dos. Me queda muchísimo por aprender.
Cita:
|
Solo por completar un poquillo más...
Un IBScript, como su nombre indica, puede albergar todo el código de creación de tablas, triggers, etc de la base de datos, TODO en un solo Script. Es más compacto y fácil de leer, sobre todo si lo tienes en un fichero de texto y lo cargas en ejecución. Se mete todo en la propiedad IBScript1.Script (TStrings) y se ejecuta con IBScript1.ExecuteScript (creo recordar). Por cierto, en lugar de "create procedure" puedes usar "create or alter procedure", también aplicable a tablas y otros elementos. Así no tienes que chequear si ya existe. No sé que versión de los IBX usas, puede que no deje usar esa sintaxis... por probar no pierdes nada. Saludos. |
Gracias por los comentarios. Sobre el mensaje de Lepe, que no sé si va dirigido a mi, decir que no uso los componentes IBX.
|
Cita:
|
Las paletas de componentes que vienen con Builder.
|
Cita:
|
En Builder 6 tengo dos paletas: Interbase e Interbase Admin. Son las que uso.
|
Hola Angel.
Si usas los componentes de las pestañas que mencionas, son los IBX. Pero la versión C++ Builder 6 que poseo no trae de forma nativa el componente IBScript. Saludos :) |
Esos son los IBX :)
EDITO: No había visto el mensaje de ecfisa. |
Cita:
|
La franja horaria es GMT +2. Ahora son las 07:25:22. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi