FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
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(); Auxiliar->SQL->Text = "SELECT COUNT(*) Hay FROM RDB$PROCEDURES WHERE RDB$PROCEDURE_NAME = 'Persona_Bor_Aux'"; Auxiliar->Open(); Código:
if (Auxiliar->FieldByName("Hay")->AsInteger == 0) { if (!IbSql->Transaction->InTransaction) IbSql->Transaction->StartTransaction(); IbSql->Close(); IbSql->SQL->Text = Codigo; IbSql->ExecQuery(); IbSql->Transaction->CommitRetaining(); } |
#2
|
||||
|
||||
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. |
#3
|
||||
|
||||
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:
... { // Verificar si ya existe IBQuery1->Close(); IBQuery1->SQL->Clear(); IBQuery1->SQL->Add("SELECT RDB$PROCEDURE_ID FROM RDB$PROCEDURES"); IBQuery1->SQL->Add("WHERE RDB$PROCEDURE_NAME = 'SP_MULT'"); IBQuery1->Open(); if (IBQuery1->IsEmpty()) { // si no existe -> crearlo IBSQL1->Close(); IBSQL1->ParamCheck = false; // <- IBSQL1->SQL->Clear(); IBSQL1->SQL->Add("CREATE PROCEDURE SP_MULT(A INTEGER, B INTEGER)"); IBSQL1->SQL->Add("RETURNS(RESULT INTEGER) AS"); IBSQL1->SQL->Add("BEGIN"); IBSQL1->SQL->Add("RESULT = :A * :B;"); IBSQL1->SQL->Add("SUSPEND;"); IBSQL1->SQL->Add("END"); IBSQL1->ExecQuery(); } else MessageBox(0, "El procedimiento almacenado ya existe", "", MB_ICONWARNING); ...
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#4
|
||||
|
||||
Cita:
¡Ah! Pues no se me había ocurrido. Haré la prueba y os diré como ha ido. |
#5
|
||||
|
||||
Prueba rápida. Funcionó a la perfección. Muchísimas gracias a los dos. Me queda muchísimo por aprender.
Gracias por tu aportación. Mientars escribías la respuesta estaba haciendo yo la prueba. |
#6
|
||||
|
||||
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.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#7
|
|||
|
|||
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í:
__________________
Luis Fernando Buelvas T. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
CREATE DATABASE ¿Desde Delphi? | champy | Firebird e Interbase | 3 | 07-08-2013 18:48:14 |
llamar a procedure desde otra procedure | anubis | Varios | 23 | 04-03-2010 18:44:37 |
CREATE PROCEDURE en Access ...? | Ledian_Fdez | SQL | 1 | 09-12-2009 10:22:54 |
CREATE TABLE desde Delphi | egostar | Firebird e Interbase | 29 | 05-07-2007 20:15:00 |
error en create function | lookmydoom | MySQL | 0 | 12-01-2007 04:20:59 |
|