1

我想实现一个只返回登录用户并只显示那里记录的查询,我做了如下并且它有效:

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

但是,我有另一列名为 User_Type,用户可以是类型 1、2 或 3。如果我的用户类型为 1,我希望查询也返回所有表记录,因为用户类型 1 是管理员。

我想过这样做:

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

但它在 APEX Oracle PLSQL 中不起作用。

有什么建议么?

4

3 回答 3

7

据我了解,您需要尝试以下操作:

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

输出存储在嵌套表变量tbl_emp中。

编辑:

也可以使用纯 SQL 来实现,如下所示:

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

选择最适合您的。

于 2013-04-11T12:18:10.660 回答
2

你想要来自用户的所有记录,要么UPPER(username)v('APP_USER')要么User_Type是 1?然后只需使用OR

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

如果这不是你的意思,那么你能解释得更清楚吗?

于 2013-04-11T12:01:31.337 回答
1

尝试:

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')
于 2013-04-11T12:12:52.937 回答