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)1であるv('APP_USER')か、1 であるユーザーからのすべてのレコードが必要User_Typeですか? 次に、次を使用します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 に答える