2011-09-26 10 views
26

En SQL Server podemos utilizar esto:Declarar una variable y estableciendo su valor a partir de una consulta SELECT en Oracle

DECLARE @variable INT; 
SELECT @variable= mycolumn from myTable; 

¿Cómo puedo hacer lo mismo en Oracle? Actualmente estoy haciendo lo siguiente:

DECLARE COMPID VARCHAR2(20); 
SELECT companyid INTO COMPID from app where appid='90' and rownum=1; 

¿Por qué esto no es de trabajo?

enter image description here

+0

¿Alguna idea de cómo esto puede funcionar para los tipos como objetos? – Avias

Respuesta

54

SELECT INTO

DECLARE 
    the_variable NUMBER; 

BEGIN 
    SELECT my_column INTO the_variable FROM my_table; 
END; 

Asegúrese de que la consulta sólo devuelve una sola fila:

Por defecto, una instrucción SELECT INTO debe devolver una sola fila. De lo contrario, PL/SQL plantea la excepción predefinida TOO_MANY_ROWS y los valores de las variables en la cláusula INTO no están definidos. Asegúrese de que su cláusula WHERE sea lo suficientemente específica como para coincidir solo con una fila

Si no se devuelven las filas, PL/SQL genera NO_DATA_FOUND. Puede protegerse contra esta excepción seleccionando el resultado de una función agregada, como COUNT (*) o AVG(), cuando sea práctico. Se garantiza que estas funciones devuelvan un solo valor, incluso si ninguna fila coincide con la condición.

A SELECCIONAR ... La sentencia BULK COLLECT INTO puede devolver varias filas. Debe configurar las variables de recopilación para contener los resultados. Puede declarar matrices asociativas o tablas anidadas que crecen según sea necesario para contener todo el conjunto de resultados.

El cursor implícito SQL y sus atributos% NOTFOUND,% FOUND,% ROWCOUNT y% ISOPEN proporcionan información sobre la ejecución de una instrucción SELECT INTO.

+0

DECLARE COMPID VARCHAR2 (20); SELECCIONE companyid EN COMP. De sasapplication donde appid = '90 'y rownum = 1; ¿Puedes decir por qué este sql arroja el error – user960567

+0

y el mensaje de error sería? – Thilo

+0

acaba de ver arriba. – user960567

4

No del todo seguro de lo que buscas, pero en PL/SQL sólo tendría que

DECLARE 
    v_variable INTEGER; 
BEGIN 
    SELECT mycolumn 
    INTO v_variable 
    FROM myTable; 
END; 

Ollie.

+0

Como @Thilo dice, hay mucho más a considerar alrededor de este synatx específico. Un poco más de información sobre lo que está tratando de lograr nos permitirá adaptar un mejor método para poblar su variable. – Ollie

0

ORA-01422: traiga exacta vuelve más número solicitado de filas

si no se especifica el registro exacto mediante el uso donde la condición, recibirá la excepción anterior

DECLARE 
    ID NUMBER; 
BEGIN 
    select eid into id from employee where salary=26500; 
    DBMS_OUTPUT.PUT_LINE(ID); 
END; 
0

Para almacenar una salida de fila única en una variable desde la consulta de selección en:

declarar v_nombre de usuario varchare (20); SELECCIONE el nombre de usuario en v_username DE los usuarios DONDE user_id = '7';

Esto almacenará el valor de un solo registro en la variable v_nombredeusuario.


Para el almacenamiento de salida múltiples filas en una variable de la consulta de selección en:

usted tiene que utilizar la función listagg.listagg concatena las filas resultantes de un coloumn en un solo coloumn y tambin para diferenciarlas puede usar un smbolo especial. utilice la consulta de la siguiente manera SELECCIONE listagg (nombre de usuario || ',') dentro del grupo (orden por nombre de usuario) en v_nombredeusuario FROM usuarios;

0

Un punto adicional:

Cuando se está convirtiendo de tsql a plsql usted tiene que preocuparse de no_data_found excepción

DECLARE 
    v_var NUMBER; 
BEGIN 
    SELECT clmn INTO v_var FROM tbl; 
Exception when no_data_found then v_var := null; --what ever handle the exception. 
END; 

En tsql si no data found entonces la variable será null pero sin exception

Cuestiones relacionadas