PL/SQL Oracle Query Con SE la Dichiarazione

Voglio realizzare una query che restituisce solo gli utenti registrati e mostra c’record, che ho fatto come segue e funziona:

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

Tuttavia, ho un’altra colonna denominata User_Type, e un utente può essere di tipo 1, 2 o 3. Se io sono un utente di tipo 1, la query deve restituire tutti i tavoli record di troppo, come un utente di tipo 1 è un admin.

Ho pensato di fare così:

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

Ma non funziona in APICE Oracle PLSQL.

Qualche suggerimento?



3 Replies
  1. 7

    Da quello che ho capito hai bisogno di provare questo:

    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;
    /

    L’output viene memorizzato nella tabella nidificata variabile tbl_emp.

    EDIT:

    Può essere raggiunto utilizzando SQL puro inoltre, come questa:

    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')

    Scegliere a seconda di quale è più adatto per voi.

  2. 2

    Si desidera che tutti i record di utenti con UPPER(username) essere v('APP_USER') o User_Type 1? Poi basta usare OR:

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

    Se non è quello che vuoi dire, allora si può spiegare in modo più chiaro?

    • quando si fa solo con app_user, solo ritorno che username record, a meno che l’utente dispone di un ‘1’ tipo di utente quindi restituire l’intera tabella.
    • Non riesco a capire. Ci potrebbero essere molti di record che soddisfano upper(username) = v('APP_USER')?
  3. 1

    Provare:

    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')
    • Molto comprensibile e compatto, ma io sono solo un po ‘ preoccupato per le prestazioni così come io sono un grande distinctfobici. Puoi spiegare l’impatto sulle prestazioni?
    • Il distinct è inclusa la possibilità che più di un dipendente record soddisfa i UPPER(e1.username) = v('APP_USER') condizione – se questo non accadrà mai quindi il distinct può essere rimosso. Probabilmente, avrebbe un impatto significativo delle prestazioni quando si esegue una query contro una ragionevolmente grande tavolo, che dire, diverse centinaia di migliaia di record, ma il dipendente tabelle sono di solito relativamente piccolo, in modo che l’impatto sulle prestazioni è probabile che sia relativamente piccolo.

Lascia un commento