sql-server - tutorial - procedure oracle ejemplos
¿Cómo declaro y uso variables en PL/SQL como hago en T-SQL? (3)
En el servidor Sql, a menudo cuando estoy probando el cuerpo de un procedimiento almacenado, copio el cuerpo en SSMS, DECLARE las variables en la parte superior de la página, las configuro en algunos valores de muestra y ejecuto el cuerpo tal como está.
Por ejemplo, si mi proc es
CREATE PROC MySampleProc
@Name VARCHAR(20)
AS
SELECT @Name
Entonces mi prueba sql sería
DECLARE @Name VARCHAR(20)
SET @Name = ''Tom''
SELECT @Name
¿Cuál es el equivalente de Oracle PL / SQL a esto?
Esto es lo más cercano que he encontrado, pero estoy obteniendo "PLS-00428: se espera una cláusula INTO en esta declaración SELECT"
DECLARE
myname varchar2(20);
BEGIN
myname := ''Tom'';
select myname from DUAL;
END;
Este es un mejor ejemplo de lo que realmente estoy tratando de hacer:
DECLARE
myname varchar2(20);
BEGIN
myname := ''Tom'';
SELECT *
FROM Customers
WHERE Name = myname;
END;
Pero nuevamente, quiere un ''INTO'' cuando realmente solo quiero que los registros se impriman en la pantalla, no se almacenen en otra tabla ...
RESUELTO:
Gracias a @Allan, lo tengo funcionando bastante bien. Oracle SQL Developer aparentemente recuerda los valores de los parámetros con los que lo suministra. El desarrollador PL / SQL, sin embargo, no quiere tener nada que ver con esto ...
Si ejecuta "Ejecutar como secuencia de comandos", cumplirá con sus valores predeterminados, pero solo devolverá los resultados como texto ASCI, no en una cuadrícula / hoja de cálculo
En Oracle PL / SQL, si está ejecutando una consulta que puede devolver varias filas, necesita un cursor para iterar sobre los resultados. La forma más sencilla es con un bucle for, por ejemplo:
declare
myname varchar2(20) := ''tom'';
begin
for result_cursor in (select * from mytable where first_name = myname) loop
dbms_output.put_line(result_cursor.first_name);
dbms_output.put_line(result_cursor.other_field);
end loop;
end;
Si tiene una consulta que devuelve exactamente una fila, entonces puede usar la sintaxis select...into...
, por ejemplo:
declare
myname varchar2(20);
begin
select first_name into myname
from mytable
where person_id = 123;
end;
Las variables no están definidas, pero declaradas.
Esto es posible duplicado de declarar variables en un bloque pl / sql
Pero puedes mirar aquí:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#i27306
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm
ACTUALIZAR:
Consulte aquí: ¿Cómo devolver un conjunto de resultados / cursor desde un bloque anónimo de Oracle PL / SQL que ejecute SQL dinámico?
Respuesta revisada
Si no está llamando a este código desde otro programa, una opción es omitir PL / SQL y hacerlo estrictamente en SQL usando variables de enlace:
var myname varchar2(20);
exec :myname := ''Tom'';
SELECT *
FROM Customers
WHERE Name = :myname;
En muchas herramientas (como Toad y SQL Developer), omitir las declaraciones var
y exec
hará que el programa le solicite el valor.
Respuesta original
Una gran diferencia entre T-SQL y PL / SQL es que Oracle no le permite devolver implícitamente el resultado de una consulta. El resultado siempre tiene que ser explícitamente devuelto de alguna manera. La forma más sencilla es usar DBMS_OUTPUT
(aproximadamente equivalente a print
) para generar la variable:
DECLARE
myname varchar2(20);
BEGIN
myname := ''Tom'';
dbms_output.print_line(myname);
END;
Sin embargo, esto no es muy útil si está intentando devolver un conjunto de resultados. En ese caso, querrás devolver una colección o un refcursor. Sin embargo, usar cualquiera de esas soluciones requeriría ajustar su código en una función o procedimiento y ejecutar la función / procedimiento desde algo que sea capaz de consumir los resultados. Una función que funcionó de esta manera podría verse así:
CREATE FUNCTION my_function (myname in varchar2)
my_refcursor out sys_refcursor
BEGIN
open my_refcursor for
SELECT *
FROM Customers
WHERE Name = myname;
return my_refcursor;
END my_function;