Ver Mensaje Individual
  #99  
Antiguo 13-11-2012
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Reputación: 21
RONPABLO Va por buen camino
Cita:
Empezado por poliburro Ver Mensaje
Entonces entiendo que el suspend identifica de manera explicita que select quieres devolver... lo cual no debería ser necesario peus el mismo lenguaje PLSQL o TSQL establece la manera en que un sp retorna un recordset...

supongo que debe tener algún uso adicional en firebird... o es solo ese? identificar que selecte se devolvera?
El suspend se usa para procedimientos almacenados que retornan un Dataset con varias columnas y varios registros, como tal es la orden de mandar la información en el momento que usted quiera, así pues uno hace el
Código SQL [-]
select campo1, campo2 from  tabla
Y no por eso se va a retornar los datos de campo1 y campo2 como resultados de un cursor, en Firebird tengo que declarar que parametros van a salir en el cursor e ir por medio de un comando llamado "for select" recorriendo el dataset que necesito consultar, ahora yo con la información que me retorna Campo1, Campo2 en el "for select " no necesariamente es la que quiero mostrar, con ella por ejemplo necesito hacer varias operaciones antes de mostrarla y al final puedo entregar un recordSet construido con información muy diferente a la que viene en la consulta original y es ahí cuando tengo el resultado que igual en una o varias variables de resultado y doy la orden de suspend y me sale un recordset con campo3 y campo4 que eran los resultados obtenidos por campo1 y campo2,

también puedo fabricar un recordset de algo que no es una tabla, ejemplo

Código SQL [-]
SET TERM ^^ ;
CREATE PROCEDURE SP_CADENA_A_RECORD (
  AINPUT VarChar(8192))
 returns (
  VALOR Integer)
AS
declare variable LASTPOS integer;
declare variable NEXTPOS integer;
begin
  AINPUT = :AINPUT || ',';
  LASTPOS = 1;
  NEXTPOS = position(',', :AINPUT, LASTPOS);
  while (:NEXTPOS > 1) do
  begin
    valor = cast(substring(:AINPUT from :LASTPOS for :NEXTPOS - :LASTPOS) as integer);
    LASTPOS = :NEXTPOS + 1;
    NEXTPOS = position(',', :AINPUT, LASTPOS);   
    suspend;
  end
  
end ^^
SET TERM ; ^^

Con el procedimiento almacenado anrterio envio como paramentro de entrada una seríe de números separados por comas, por decir "1,4,6,7,12,22", internamente hago una operación de cadenas y retorno como recortset los números en valor entero, y con ellos puedo hacer inner joins on validaciones tipo exists que me funcionan más rápido que validaciones "where campo in ('1,4,6,7,12,22').


la verdad siento que no soy muy claro al tratar de explicarme, pero eso es una idea de lo que hace el suspend
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita