Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-01-2012
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Procedimiento almacenado con BD externa

Tengo el siguiente problema en un procedimiento almacenado. Utilizo Firebird 2.5 con una llamada a una base de dato externa.

un extracto del codigo, el problema esta en el campo prueba (integer) de la tabla proveedor de la BD externa, cuando trato de insertar el registro de la tabla de la BD local si es null, me arroja un error.
El resto de los campos son string, ahi no tengo problema.

Código SQL [-]
select razon, rut, giro, prueba from proveedor where id_proveedor=:id_prov into :razon, :rut1, giro, rueba1; -- base de dato local
 
-- necesariamente tengo que agregar las comillas, sino no funciona.
razon =  ''''||:razon ||'''';
rut1 =  ''''||:rut1 ||'''';
giro =  ''''||:giro ||'''';
prueba =  ''''||rueba1 ||'''';
--prueba = null;
 
ExECUTE STATEMENT   -- base de dato externa
'INSERT INTO proveedor (id_proveedor, razon, rut, giro, prueba)'||
' values ('||:c1||', '||:razon||', '||:rut1||', '||:giro||', '||rueba||')'
ON EXTERNAL DATA SOURCE ATA||':C:\BD.FDB'
AS USER 'SYSDBA' PASSWORD '123';

Alguna idea de como resolverlo??
Responder Con Cita
  #2  
Antiguo 25-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por mjjj Ver Mensaje
cuando trato de insertar el registro de la tabla de la BD local si es null, me arroja un error.
¿Y qué error es?, ¿ese campo permite nulos?
Responder Con Cita
  #3  
Antiguo 26-01-2012
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
El campo prueba (tal como su nombre lo dice, es para probar) y permite registros null. El problema se genera en la siguiente linea de codigo

Código SQL [-]
prueba =  ''''||rueba1||'''';

lo que ocurre es que al ejecutar la sentencia para inserta un registro la tabla proveedor de la BD externa, solo puedo pasar variables de tipo string, entonces al convertir null en entero me arroja un error.

Los campos prueba de las tablas proveedor son en ambos casos entero, pero si en la tabla original esta null, me arroja el error en el codigo antes señalado.

El tema lo resolví de la siguiente manera.

Código SQL [-]
if (prueba1 is null) then prueba = '0'; else prueba =  ''''||rueba1 ||'''';

Nose si será de la forma más correcta, pero funciona, se les ocurre añguna mejor manera de solucionarlo? por ejemplo tratar de mater variables de tipo entero en la sentencia de insert en la BD externa... esto no se como hacerlo!!
Responder Con Cita
  #4  
Antiguo 26-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Algo similar es:

Código SQL [-]
select razon, rut, giro, coalesce(prueba,'0') from ...

Te paso un ejemplo de cómo lo hago yo para pasar campos numéricos, los paso a una variable de cadena:

Código SQL [-]
CREATE OR ALTER trigger tbapuntes_ai0 for tbapuntes
active after insert position 0
AS
  declare variable iMes        integer;
  declare variable cCampoDebe  varchar(8);
  declare variable cCampoHaber varchar(8);
  declare variable cSql        varchar(512);
  declare variable cValorDebe  varchar(18);
  declare variable cValorHaber varchar(18);
begin
  /* actualizar tbSaldosCuentas */
  if (new.codigoestadoapunte=2) then  /* 1.definitivo  2.borrador */
  begin
    update tbSaldosCuentas
    set debetotal=debetotal+new.debe,
        habertotal=habertotal+new.haber
    where codigoempresa=new.codigoempresa
    and ejercicio=new.ejercicio
    and codigocuenta=new.codigocuenta;
  end
  else /* no es borrador, es definitivo */
  begin
    iMes = extract(month from new.fechaasiento);
    cCampoDebe  = 'debe'  || cast(iMes as varchar(2));
    cCampoHaber = 'haber' || cast(iMes as varchar(2));
    cValorDebe  = cast(new.debe  as varchar(18));
    cValorHaber = cast(new.haber as varchar(18));
    cSql = 'update tbsaldoscuentas '||
           'set debetotal=debetotal+'||cValorDebe||
           ',habertotal=habertotal+'||cValorHaber||','||
           cCampoDebe  || '=' || cCampoDebe  || '+'||cValorDebe||','||
           cCampoHaber || '=' || cCampoHaber || '+'||cValorHaber||
           ' where codigoempresa='||cast(new.codigoempresa as varchar(18))||
           ' and ejercicio='||cast(new.ejercicio as varchar(18))||
           ' and codigocuenta='||''''||new.codigocuenta||'''';
    /* --- debug --> */
    /*insert into tbdebug (texto) values (:csql);*/
    /* <-- debug --- */
    execute statement cSql;
  end
end
^
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
??Como modificar una variable externa en un procedimiento?? jasmad Lazarus, FreePascal, Kylix, etc. 6 01-12-2011 23:40:38
procedimiento almacenado lurad Oracle 2 01-03-2008 05:05:25
Procedimiento Almacenado egostar Firebird e Interbase 4 15-12-2006 02:04:07
Procedimiento almacenado LucianoRey MS SQL Server 2 23-08-2005 00:37:06
procedimiento almacenado haron Firebird e Interbase 2 29-09-2003 01:09:56


La franja horaria es GMT +2. Ahora son las 11:29:04.


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
Copyright 1996-2007 Club Delphi