2012-06-04 9 views
22

En el servidor Sql, muchas veces cuando estoy probando el cuerpo de un procedimiento almacenado, copio el cuerpo en SSMS, DECLARO las variables en la parte superior de la página, las ajusto a algunos valores de muestra y ejecuto el cuerpo como- es.¿Cómo declaro y uso variables en PL/SQL como lo hago en T-SQL?

Por ejemplo, si mi proc es

CREATE PROC MySampleProc 
    @Name VARCHAR(20) 
AS 
    SELECT @Name 

Entonces mi sql prueba sería

DECLARE @Name VARCHAR(20) 
SET  @Name = 'Tom' 

    SELECT @Name 

¿Cuál es el Oracle PL/SQL equivalente a esto?

Este es el más cercano que he llegado con, pero me estoy poniendo "PLS-00428: una cláusula INTO se espera en esta instrucción SELECT"

DECLARE 
    myname varchar2(20); 
BEGIN 
    myname := 'Tom'; 

    select myname from DUAL; 
END; 

Este es un ejemplo de lo mejor realmente estoy tratando de hacer:

DECLARE 
    myname varchar2(20); 
BEGIN 
    myname := 'Tom'; 

    SELECT * 
    FROM Customers 
    WHERE Name = myname; 
END; 

Pero, de nuevo, que quiere una 'en' cuando en realidad sólo quiero los registros impresos en la pantalla, no se almacenan en otra tabla ....

RESUELVE :

Gracias a @Allan, lo tengo funcionando bastante bien. Oracle SQL Developer aparentemente recuerda los valores de los parámetros que usted le proporciona. PL/SQL Developer, sin embargo, no quiere tener nada que ver con esto ....

enter image description here

Si "Ejecutar como escritura", que va a cumplir con sus valores por defecto, pero sólo devolverá resultados como texto ASCI , no en una cuadrícula/hoja de cálculo

enter image description here

+0

Este es el que más cerca encontrado a mi respuesta, pero no muestran cómo usar la variable dentro de la lista de selección de la consulta, y eso me sigue arrojando errores. http://plsql-tutorial.com/plsql-variables.htm –

+0

Hay dos problemas en su último fragmento de código. 1) No se necesitan dos puntos delante de la variable, ni en la tarea ni en la instrucción SELECT. 2) El resultado de la instrucción SELECT debe ir a alguna parte, p. declaras una segunda variable y escribes 'SELECT Name INTO Name2 FROM DUAL'. – Codo

+0

¿Qué pasa si no quiero que los resultados lleguen a algún lado, solo quiero que aparezcan en una cuadrícula en PL/SQL Developer? –

Respuesta

18

respuesta revisada

Si usted no está llamando a este código de otro programa, una opción es saltarse PL/SQL y hacerlo estrictamente en SQL utilizando variables de enlace:

var myname varchar2(20); 

exec :myname := 'Tom'; 

SELECT * 
FROM Customers 
WHERE Name = :myname; 

En muchas herramientas (como Toad y SQL Developer), al omitir las declaraciones var y exec, el programa le solicitará el valor.


respuesta original

Una gran diferencia entre T-SQL y PL/SQL de Oracle es que no le permite implícitamente devuelve el resultado de una consulta. El resultado siempre debe ser devuelto explícitamente de alguna manera. La forma más sencilla es utilizar DBMS_OUTPUT (aproximadamente equivalente a print) a la salida de la variable:

DECLARE 
    myname varchar2(20); 
BEGIN 
    myname := 'Tom'; 

    dbms_output.print_line(myname); 
END; 

Esto no es muy útil si usted está tratando de devolver un conjunto de resultados, sin embargo. En ese caso, querrá devolver una colección o un refcursor. Sin embargo, el uso de cualquiera de esas soluciones requeriría envolver su código en una función o procedimiento y ejecutar la función/procedimiento de algo que sea capaz de consumir los resultados. Una función que trabajó de esta manera podría ser algo como esto:

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; 
+0

Creo que su tercer ejemplo es lo que estoy buscando. ¿Cómo podría ejecutar eso en PL/SQL Developer? Si uso esa sintaxis, obtengo una "declaración SQL no válida" en la línea var? ¿O solo necesito usar Toad? –

+0

Dejé un punto afuera de la declaración 'exec' inicialmente. Con los dos puntos, si ejecuta "Ejecutar script" debería funcionar en SQL Developer, pero los resultados se mostrarán en el panel de salida del script, en lugar de la cuadrícula de resultados de la consulta. Dada la limitada experimentación, la única forma que he encontrado para obtenerla en la grilla es omitir las declaraciones 'var' y' exec' y dejar que SQL Developer te solicite un valor. – Allan

+0

Sigo recibiendo "ORA-01008: no todas las variables vinculadas". ¿Debo ejecutar esto como una "ventana SQL" o una "ventana de prueba" o alguna otra ventana? –

1
+0

Tal vez no estoy haciendo la pregunta correcta. Basado en su enlace, obtengo cómo asignar el valor, pero ¿cómo lo selecciono y lo muestro en un conjunto de resultados? –

+0

¿A qué te refieres con mostrarlo en un conjunto de resultados? ¿Desea seleccionar el valor como una función? – rkosegi

+0

Actualicé la cola de la pregunta con un mejor ejemplo de lo que estoy tratando de hacer/responder a su pregunta de seguimiento. –

4

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, 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 usted tiene una consulta que devuelve exactamente una fila, a continuación, puede utilizar la sintaxis select...into..., por ejemplo:

declare 
    myname varchar2(20); 
begin 
    select first_name into myname 
    from mytable 
    where person_id = 123; 
end; 
Cuestiones relacionadas