Quiero implementar una consulta que devuelve solo el usuario que ha iniciado sesión y muestra no sólo el registro, que he hecho de la siguiente manera y funciona:

SELECT * FROM EMPLOYEE
WHERE UPPER(username) = v('APP_USER')

Sin embargo, tengo otra columna llamada User_Type, y un usuario puede ser del tipo 1, 2 o 3. Si tengo un tipo de usuario de 1, quiero que la consulta que devuelva todas las tablas de registros también como el tipo de usuario 1 es un admin.

He pensado en hacer algo como esto:

BEGIN
SELECT * FROM Employee 
WHERE upper(username) = v('APP_USER')
IF User_Type = 1
THEN SELECT * FROM Employee
END IF;
END;
/

Pero no funciona en APEX de Oracle PLSQL.

Alguna sugerencia?

3 Comentarios

  1. 7

    De lo que yo entiendo que usted necesita para probar esto:

    DECLARE
      emp employee%ROWTYPE; -- Create a record type
      tbl_emp IS TABLE OF emp;
      -- ^^^ Create a table of that record type
      v_user_type employee.user_type%TYPE;
      -- ^^^ Variable to store user type
    BEGIN
      SELECT user_type
        INTO v_user_type
        FROM Employee 
       WHERE upper(username) = v('APP_USER');
    
      IF v_user_type = 1 THEN
        SELECT *
               BULK COLLECT INTO tbl_emp
          FROM employee;
        -- ^^ Returns the entire table
      ELSE
        SELECT *
               BULK COLLECT INTO tbl_emp
          FROM employee;
         WHERE upper(username) = v('APP_USER');
        -- ^^ Returns the row related to the user.
      END IF;
    END;
    /

    El resultado se almacena en la tabla anidada variable tbl_emp.

    EDICIÓN:

    Puede lograrse mediante el empleo de puro SQL también, como este:

    SELECT *
      FROM employee e
     WHERE EXISTS (SELECT 1
                     FROM employees e_in
                    WHERE e_in.user_type = 1
                      AND UPPER(e_in.username) = v('APP_USER'))
        OR UPPER(e.username) = v('APP_USER')

    Elegir el que sea más adecuado para usted.

  2. 2

    Desea que todos los registros de los usuarios, ya sea con UPPER(username) ser v('APP_USER') o User_Type ser 1? Utilice sólo OR:

    SELECT * FROM Employee WHERE upper(username) = v('APP_USER') OR User_Type = 1

    Si no es eso lo que quieres decir, entonces se puede explicar más claramente?

    • cuando se hace sólo con app_user, sólo se devolverá el nombre de usuario de los registros, a menos que el usuario tiene un ‘1’ tipo de usuario, a continuación, volver a toda la tabla.
    • Yo no lo entiendo. Existen muchos registros de la satisfacción de upper(username) = v('APP_USER')?
  3. 1

    Tratar:

    select distinct e2.*
    from employee e1
    join employee e2 on (e1.username = e2.username or e1.User_Type = 1)
    where UPPER(e1.username) = v('APP_USER')
    • Muy comprensible y compacto, pero estoy un poco preocupado por el rendimiento como yo soy un gran distinctfóbica. ¿Puede por favor explicar el impacto en el rendimiento?
    • El distinct se incluye en la posibilidad de que más de un registro de empleado satisface la UPPER(e1.username) = v('APP_USER') condición – si eso nunca va a suceder a continuación, el distinct puede ser eliminado. Es probablemente tendría un impacto considerable en el rendimiento cuando se consulta contra un razonablemente grande de tabla decir, varios cientos de miles de registros – pero tablas de empleados son, en general, relativamente pequeña, por lo que el impacto en el rendimiento es relativamente pequeña.

Dejar respuesta

Please enter your comment!
Please enter your name here