Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Store Procedure en Select (https://www.clubdelphi.com/foros/showthread.php?t=51759)

fjcg02 28-12-2007 09:36:37

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

jachguate 28-12-2007 09:47:59

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.

;)

fjcg02 28-12-2007 10:34:47

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

jachguate 28-12-2007 11:02:08

Cita:

Empezado por fjcg02 (Mensaje 254757)
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 (Mensaje 254757)
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.

;)

fjcg02 31-12-2007 08:23:36

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

fjcg02 01-01-2008 22:12:05

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


La franja horaria es GMT +2. Ahora son las 18:01:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi