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
|
|||
|
|||
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. |
#6
|
||||
|
||||
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. |
#7
|
||||
|
||||
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. |
#8
|
||||
|
||||
Gracias por los comentarios. Sobre el mensaje de Lepe, que no sé si va dirigido a mi, decir que no uso los componentes IBX.
|
#9
|
||||
|
||||
#10
|
||||
|
||||
Las paletas de componentes que vienen con Builder.
|
#11
|
||||
|
||||
¿Cual es, cómo se llama?
|
#12
|
||||
|
||||
En Builder 6 tengo dos paletas: Interbase e Interbase Admin. Son las que uso.
|
#13
|
||||
|
||||
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
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#14
|
||||
|
||||
Esos son los IBX
EDITO: No había visto el mensaje de ecfisa. |
#15
|
||||
|
||||
¿Ves? Eso no lo sabía y pensaba que cuando hablabáis de los IBX eran componentes al margen de la instalación de Builder
|
|
|
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 |
|