Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-12-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Store Procedure en Select - Definicion tablas y campos

Hola a todos,
seguramente este problema se ha tratado en otros hilos, pero no consigo dar con la respuesta.

Al grano.
Tengo un Store procedure que en base a dos parametros, me devuelve un valor. Si lo ejecuto desde el IBExpert, me funciona bien, es decir, el valor que devuelve es el correcto en base a varias pruebas.

Lo que no consigo es utilizarlo en una consulta. Me dice que no existe la funcion

An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Function unknown.
MI_PROCEDURE.

Lo llamo de la siguiente manera

Código SQL [-]
SELECT CAMPO1, CAMPO2, MI_PROCEDURE(CAMPO1,CAMPO2) FROM TABLA
Utilizo FB 2.0, y estoy trabajando desde el IBExpert.

Gracias de antemano por su ayuda.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -

Última edición por fjcg02 fecha: 02-01-2008 a las 14:14:48.
Responder Con Cita
  #2  
Antiguo 28-12-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Definitivamente, en firebird, no se puede invocar un stored procedure como si se tratase de una función.

Dado que desconozco el uso que le das, porque no lo has explicado... me resulta imposible exponer alguna posible solución. Nos quedamos con que simplemente no es posible.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 28-12-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Gracias por la respuesta.

Sabeis si se puede hacer algo como lo que yo quiero ? UDF's quizás ? ¿ Y desde un mismo Store procedure que devuelva toda la select ?

Por otro lado, yo creo haber visto utilizar los SP's tal y como yo quería hacerlo. Sabeis si es en SQL Server ?

Un saludo procedural
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #4  
Antiguo 28-12-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por fjcg02 Ver Mensaje
Gracias por la respuesta.

Sabeis si se puede hacer algo como lo que yo quiero ? UDF's quizás ? ¿ Y desde un mismo Store procedure que devuelva toda la select ?
Podría ser una UDF. Esta si podes utilizarla de esta manera.

También podría ser un sp que devuelva todo el resultado, de manera que luego solamente hagás

Código SQL [-]
select *
  from stored_procedure(parametros);

Cita:
Empezado por fjcg02 Ver Mensaje
Por otro lado, yo creo haber visto utilizar los SP's tal y como yo quería hacerlo. Sabeis si es en SQL Server ?
Ignoro si sql server soporta algo similar. En donde definitivamente si es posible, es en Oracle, pero no con Stored Procedures, sino con Stored Functions.

Creo haber leído que firebird soportaría algo similar... pero no logro aclarar ahora a partir de que versión será. De lo que estoy seguro es que en la 2.0 aún no lo soporta.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 31-12-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Bueno,
finalmente he utilizado un store procedure que me devuelve la select completa. Si voy a casa y me funciona la conexión a internet publicaré el código completo de lo que me traigo entre manos.

Se trata de una select que devuelve los siguientes campos:
Nombre de tabla de LA BBDD
Nombre de campo,
Tipo,
Longitud,
decimales si procede
Permite nulos o no
Es clave primaria
Es clave foranea y a qué tabla y campo hace referencia

....

Bueno, esto lo he podido hacer gracias a una aportación de AI en otro hilo, a los trucos de Jhony referentes a claves primarias y foráneas, y a otrospost que he leido por aquí.

Mi intención es crear una clase que me haga el trabajo 'sucio' de la introducción de datos en tablas.


Gracias a todos por vuestras aportaciones

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #6  
Antiguo 01-01-2008
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Lo prometido es deuda. Os dejo el código del Store Procedure para quien quiera utilizarlo.
Además de a mi, quien le de utilidad podrá darselas a AI , a Jhony y al IBExpert concretamente a su opción de SQL Monitor.

Un saludo

Código SQL [-]

CREATE PROCEDURE Z_TABLAS
RETURNS (
    TABLA VARCHAR(20),
    POSICION INTEGER,
    CAMPO VARCHAR(20),
    TIPO VARCHAR(25),
    LONGITUD INTEGER,
    DECIMALES INTEGER,
    PERMITE_NULOS CHAR(2),
    PK INTEGER,
    FK VARCHAR(50),
    DESCRIPCION VARCHAR(500))
AS
declare variable wtipo integer;
declare variable subtipo integer;
declare variable wprecision integer;
declare variable escala integer;
declare variable nulo integer;
begin
  /* Procedure Text */
 for
  Select

RF.RDB$Relation_Name TABLA,  /* Nombre de la tabla/vista */
RF.RDB$Field_Name CAMPO,  /* Nombre del campo */
RF.RDB$Field_Position POSICION,  /* Posición del campo */
RF.RDB$Description DESCRIPCION,  /* Descripción del campo */
F.RDB$Field_Type,
F.RDB$Field_Sub_Type,
/* Tipo concreto */
F.RDB$Field_Length,
F.RDB$Field_Precision,
/* Decimales */
F.RDB$Field_Scale,
/* Permite o no valores nulos */
RF.RDB$Null_Flag

From RDB$Relation_Fields RF

/* La información de campos está distribuida en las tablas
RDB$Relation_Fields y RDB$Fields */
Left Join RDB$Fields F On RF.RDB$Field_Source = F.RDB$Field_Name

/* No incluir tablas del sistema */
Where RF.RDB$System_Flag = 0
order by
RF.RDB$Relation_Name,RF.RDB$Field_Position

INTO :tabla, :campo, posicion, :descripcion, :wtipo, :subtipo, :longitud,
     :wprecision, :escala, :nulo
do  begin
  tipo= 'Desconocido';
  if  (wtipo = 261) /* BLOb */ Then
  begin
    if (subtipo = 1) Then
      tipo='Texto BLOb';
     else
      tipo='BLOb';
  end
  if  (wtipo = 14) Then tipo='Texto Char';
  if  (wtipo = 40) Then tipo='Texto CString';
  if  (wtipo = 11) Then tipo='Numérico D_Float';
  if  (wtipo = 27) Then tipo='Numérico Double'  ;
  if  (wtipo = 10) Then tipo='Numérico Float' ;
  if  (wtipo = 16) Then
  begin
    if  (subtipo = 1) Then tipo='Numérico';
    if  (subtipo = 2) Then
       tipo='Decimal';
    Else
       tipo='Entero Int64';
  End
  if  (wtipo =  8) /* Integer */ Then
  begin
    if  (subtipo = 1) Then tipo='Numérico';
    if  (subtipo = 2) Then tipo='Decimal';  Else tipo='Entero Integer';
  End
  if  (wtipo = 9) Then tipo='Quad';
  if  (wtipo = 7 )/* SmallInt */ Then
  begin
    if  (subtipo = 1) Then tipo='Numérico';
    if  (subtipo = 2) Then tipo='Decimal' ;Else tipo='Entero SmallInt';
  End
  if  (wtipo = 12) Then tipo='Fecha Date';
  if  (wtipo = 13) Then tipo='Hora Time';
  if  (wtipo = 35) Then tipo='Fecha y hora TimeStamp';
  if  (wtipo= 37) Then tipo='Texto Varchar';

  if  (wtipo= 11) /* D_Float */ Then longitud= wPrecision;
  if  (wtipo= 27) /* Double */ Then longitud= wPrecision;
  if  (wtipo= 10) /* Float */ Then longitud= wPrecision;
  if  (wtipo= 16) /* Int64 */ Then
    if (subtipo = 1 or subtipo =2) Then longitud= wPrecision;
  if  (wtipo= 8) /* Integer */ Then
      if (subtipo= 1 or subtipo=2) Then longitud= wPrecision;
  if  (wtipo= 7 )/* SmallInt */ Then
    if  (subtipo=1 or subtipo= 2) /* Decimal */ Then longitud= wPrecision;

  if (escala = 0) Then DECIMALES= Null;
  if (escala <> 0 and escala is not null) then DECIMALES= Cast (ESCALA * -1 As integer);

  if (NULO = 1) Then PERMITE_NULOS= 'No'; Else PERMITE_NULOS= 'Si';
  pk = null;
  select i.rdb$field_position
   from rdb$relation_constraints rc, rdb$index_segments i, rdb$indices idx
   where (i.rdb$index_name = rc.rdb$index_name) and
         (idx.rdb$index_name = rc.rdb$index_name) and
         (rc.rdb$constraint_type = 'PRIMARY KEY') and
         (rc.rdb$relation_name = :TABLA) and
         (i.rdb$field_name = :CAMPO)
   into :PK ;
   if (pk  is not null )  then pk = pk+1;

   fk = null;
   select 'FK: ' ||trim(D.RDB$FIELD_NAME)||' en Tabla '||trim(C.RDB$RELATION_NAME) FK
   from RDB$REF_CONSTRAINTS B, RDB$RELATION_CONSTRAINTS A, RDB$RELATION_CONSTRAINTS C,
        RDB$INDEX_SEGMENTS D, RDB$INDEX_SEGMENTS E, RDB$INDICES I
   where (A.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY') and
         (A.RDB$CONSTRAINT_NAME = B.RDB$CONSTRAINT_NAME) and
         (B.RDB$CONST_NAME_UQ=C.RDB$CONSTRAINT_NAME) and (C.RDB$INDEX_NAME=D.RDB$INDEX_NAME) and
         (A.RDB$INDEX_NAME=E.RDB$INDEX_NAME) and
         (A.RDB$INDEX_NAME=I.RDB$INDEX_NAME) and
         (A.RDB$RELATION_NAME = :TABLA) and
         (D.RDB$FIELD_NAME = :CAMPO)
         into :FK;
  suspend;
  end

end
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
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
Store Procedure sépoco MS SQL Server 5 10-01-2008 16:11:54
Problema con entrecomillado en sentencia select in dentro de un Store Procedure Caballero Negro MS SQL Server 3 12-01-2007 02:46:37
Store procedure php jorgito MySQL 1 06-06-2006 08:55:12
Store Procedure en intebase jgutti Firebird e Interbase 2 12-05-2006 15:12:55
store procedure ronimaxh Firebird e Interbase 2 24-06-2003 20:20:22


La franja horaria es GMT +2. Ahora son las 09:38:37.


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