Ciclos en T-SQL?

25/09/2004 - 04:33 por Leonardo Azpurua | Informe spam
Hola.

Ayer estaba instalando donde un cliente un antiguo sistema escrito en "C"
para MSDOS/Netware mientras una colega hacia unos ajustes en sus sistema de
negocios, escrito con las herramientas de desarrollo de Oracle. Como nunca
había tenido ningun contacto con Oracle, le pedí que me dejara mirar algunos
SPs, y vi una cosa que casi me mata de la envidia:

FOR P IN (SELECT C1, C2, C3 FROM T1)
FOR G IN (SELECT D1, D2, D3 FROM T2 WHERE D1 = P.C1)
...
END LOOP
END LOOP
(no estoy seguro de que los END LOOP de verdad se escriban asi, pero esa es
la idea).

A pesar de haber tenido algunas dificultades sigo aceptando el dogma de que
todo lo que puede ser expresado mediante estructuras de control de flujo
puede expresarse usando instrucciones de manipulacion de datos. Pero qué
cantidad de trabajo podría uno ahorrarse si pudiera disponer de una
construccion equivalente en T-SQL.

En cuanto llegué a casa revise los BOL, y no encontre nada parecido.

¿De verdad no hay nada parecido en T-SQL? ¿Tal vez alguna manera de
simularlo?

Salud!

Leonardo

Preguntas similare

Leer las respuestas

#6 ulises
28/09/2004 - 15:59 | Informe spam
Puedes revisar los procedimientos almacenados que existen
en la master, muchos de ellos se basan en cursores.

Refiriéndonos solo PL/SQL y T-SQL, creo que hay que
reconocer que PL/SQL es como lenguaje mucho más poderoso.
Cosas que envidio de PL/SQL (que espero que se incluyan en
T-SQL) son los BEFORE TRIGGERS, el soporte a arrays, y
sobretodo el manejo del "bulk bind" dentro de cursores
implícitos que permite eliminar en gran parte el overhead
por el manejo de los mismos.

El SQL Server 2005 traerá varias mejoras en T-SQL además
de permitir crear objetos en la BD usando lenagujes .NET
(aunque Stinger DB2 8.2 que ya se ha liberado también lo
permite ¿alguien lo ha probado?).

Saludos,
Ulises


"Gustavo Larriera [MVP]"


escribió en el mensaje
news:%23v$
La construcción FOR LOOP de Oracle PL/SQL es la forma




implícita de manejar
cursores. En T-SQL eso se hace con cursores explícitos.




Compara estos dos
ejemplos:

ORACLE PL/SQL:

begin
FOR r IN (
SELECT ename
from emp
where ename < 'C'
order by 1) LOOP
dbms_output.put_line(r.ename);
END LOOP;
end;

SQL SERVER T-SQL:

declare @lname varchar(30)
DECLARE c1 cursor FOR
select lname
from employee
where lname < 'C'
order by 1
OPEN c1
FETCH c1 into @lname
WHILE @@FETCH_STATUS = 0
begin
print @lname
FETCH c1 into @lname
end
CLOSE c1
DEALLOCATE c1



Hola, Gustavo

Y gracias por la respuesta.

He leido cantidad de veces que no es conveniente utilizar


cursores en los
SPs (aunque hay cosas que desde el punto de vista del


texto, y de la logica,
se facilitarian muchísimo). Pero tembien he descubierto


que la mayoria de
las cosas que se escuchan son repeticiones generalmente


aceptada de una
mentira originaria. ¿Es realmente inconveniente el uso de


cursores en los
SPs? ¿Por qué?

Con respecto al ejemplo, si en vez del nombre quisieramos


el Nombre y el
Cargo, poriamos escribir?

declare @lname varchar(30), @Cargo vachar(8)

DECLARE c1 cursor FOR
select lname, Cargo
from employee
where lname < 'C'
order by 1
OPEN c1
FETCH c1 into @lname, @Cargo
WHILE @@FETCH_STATUS = 0
begin
print @lname + ' ES UN ' + @Cargo
FETCH c1 into @lname, @Cargo
end
CLOSE c1
DEALLOCATE c1

es decir, ¿incluimos tantas columnas como necesitemos en


la sentencia origen
del cursor, y luego obtenemos esos campos asociandolos


con variables en la
posicion ordinal correspondiente del FETCH?

Si no, ¿como?

Gracias,

Leonardo
mvp vb

P.S.: La verdad, en este caso concreto, me gusta mas la


implementacon en PL.


.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida