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)
-   -   stored procedure y sentencia count (https://www.clubdelphi.com/foros/showthread.php?t=57092)

miguel_e 05-06-2008 03:10:17

stored procedure y sentencia count
 
hola a todos, disculpen lo tonto de esta pregunta, pero espero me puedan ayudar, apenas estoy empezando a utilizar Firebird y ya me encuentro un problema el cual no puedo resolver, se trata de lo siguiente:

en MSSQL Server yo para hacer un count de una tabla hacia todo de esta manera, por ejemplo:

Código SQL [-]
  Select @cantidad = count(*) From Tabla1
  return @cantidad

ahora estoy creando mi primer stored procedure en firebird, y pongo lo mismo y me da un error en la linea del select, pongo a continuacion el codigo del sp para que me digan si es que pongo algo mal

Código SQL [-]
SET TERM ^ ;

CREATE PROCEDURE sp_obtenerCantidad
RETURNS
(
    cantidad Integer )
AS
BEGIN 
  select cantidad = count(*) from Tabla1
END^
SET TERM ; ^
GRANT EXECUTE
 ON PROCEDURE sp_obtenerCantidad TO SYSDBA;

mis preguntas son las siguientes: basicamente cambia la sintaxis del SQL entre MSSQL y Firebird o esas cosas basicas funcionan en ambas DB?????
Es problema del select o es algo que esta mal declarado dentro del sp??????
puedo usar el return del mismo modo que hacia en la primera sentencia????

bueno, eso era todo

saludos
miguel_e

Faust 05-06-2008 04:16:49

No pones que error te da, por lo que no sé si te funcione, pero pon ":" (dos puntos) así:

Código SQL [-]
select :cantidad = count(*) from Tabla1

Para indicar que estás usando la variable de retorno.

RONPABLO 05-06-2008 04:22:30

los sp en Firebird y MSSQL Server son muy diferentes.... por ejemplo en Firebird debe definir cuales son las columnas que van a resultar en un sp cuando es de querys, debe usar el comando suspend y las variables se igualan de otra forma

Código SQL [-]
Select count(*) from tabla into :Cantidad

Las variables en Firebird se reconocen con los ":".... hay muchas cosas que se hacer ne Firebird que de forma muy diferente a SQL Server y lo mismo al revés... como tal los SP se salen de la norma Standar casi que en todos los tipos de motores

miguel_e 05-06-2008 15:33:19

miren aca esta el codigo Sql con una modificacion hecha a partir de sus comentarios:

Código SQL [-]
SET TERM ^ ;
CREATE PROCEDURE sp_obtenerCantidad
RETURNS
(
    cantidad Integer )
AS
BEGIN 
  select count(*) from CPEDIDO into :cantidad
END^
SET TERM ; ^
GRANT EXECUTE
 ON PROCEDURE sp_obtenerCantidad TO SYSDBA;

y este es el error que devuelve, y que no logro saber por que me sale

Código SQL [-]
*** IBPP::SQLException ***
Context: Statement::Prepare( 
CREATE PROCEDURE sp_obtenerCantidad
RETURNS
(
    cantidad Integer )
AS
BEGIN 
  select count(*) from CPEDIDO into :cantidad
END )
Message: isc_dsql_prepare failed
SQL Message : -104
Invalid token
Engine Code    : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Token unknown - line 10, column 1
END

alguien sabe por que pasa???

saludos
miguel_e

RONPABLO 05-06-2008 16:14:36

Mira, así me corrió bien a mi en Firebird, mirando por encima lo único que creo que le falta es un ";" al final de el select Count....

Código SQL [-]
SET TERM  ^^ ;
CREATE PROCEDURE SP_OBTENERCANTIDAD returns (
  CANTIDAD Integer)
AS
begin
   select count(*) from CPEDIDO into :cantidad;
end
 ^^
SET TERM ;  ^^
GRANT EXECUTE
 ON PROCEDURE sp_obtenerCantidad TO SYSDBA;

miguel_e 05-06-2008 17:21:14

ok, gracias ya me funciono bien, una ultima pregunta, donde podria ver ejemplos de las acciones mas comunes como select que devuelvan varios valores de retorno, devolver un dataset, insertar, modificar, eliminar y eso, porque la verdad estoy un poco perdido

saludos
miguel_e

RolphyReyes 05-06-2008 18:17:34

Saludos.

En la ayuda de Interbase 6 muestran suficientes ejemplos de lo que andas buscando, entra a http://www.ibphoenix.com en la sección de descargas.

Hasta luego.

miguel_e 05-06-2008 19:03:09

he leido por arriba y entiendo cuando deseo solamente devolver parametros de salida, pero en caso que quiera devolver un dataset, o sea una tabla completa como lo hago por que no permite hacer un select * from tabla por ejemplo

saludos
miguel_e

RolphyReyes 05-06-2008 19:19:46

Saludos.

Tienes la solución en las manos y te rehúsas a utilizarla; como dirían por mi barrio "eso no prende" (
Cita:

he leido por arriba
).

Lo ideal sería que te documentaras mejor y así nosotros te podríamos ayudar en problemas más complejos.

Tu sentencia sería:
Código SQL [-]FOR SELECT CAMPO1, CAMPO2
FROM TABLA1 :PARAMETRO1, :PARAMETRO2 INTO DO BEGIN //SENTENCIAS QUE NECESITES PARA REALIZAR ALGUN PROCESO SUSPEND;
END


Hasta luego.


La franja horaria es GMT +2. Ahora son las 11:43:49.

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