variable tutorial tipos procedimientos procedimiento funciones example español ejemplos ejecutar developer declarar bloques almacenado sql-server oracle tsql plsql oracle-sqldeveloper

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;



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;