2013-04-11 4 views
1
나는 다음과 같이 내가 수행 한 경우에만 로그인 한 사용자와 표시가있는 경우에만 기록 반환하는 쿼리를 구현하고자하고 작동

:PL/SQL 오라클 쿼리 IF 문

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 오라클 PLSQL에서 작동하지 않습니다

나는 다음과 같이 그 일에 대해 생각했다.

제안 사항?

답변

2

사용자가 UPPER(username) 인 모든 레코드를 v('APP_USER') 또는 User_Type이 1이 되길 원하십니까? 그럼 그냥 OR를 사용

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

을 그건 당신이, 말은 당신이 더 명확하게 설명 할 수있는 일이 아니라면?

+0

사용자가 '1'사용자 유형이 아니라면 전체 테이블을 반환하지 않는 한 app_user를 사용하는 경우에만 해당 사용자 기록을 반환하십시오. –

+0

이해가 안됩니다. 'upper (username) = v ('APP_USER')'를 만족하는 레코드가 많이있을 수 있습니까? – drquicksilver

1

시도 :

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 변수 중첩 테이블에 저장됩니다 : 당신을 이해하는 것과

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

매우 이해하기 쉽고 컴팩트하지만 성능에 대해서는 조금 걱정이됩니다. 성능 영향에 대해 설명해 주시겠습니까? – Rachcha

+1

'distinct'는 둘 이상의 직원 레코드가 'UPPER (e1.username) = v ('APP_USER ') 조건을 만족할 수있는 기회에 포함됩니다. 발생하지 않는다면'distinct '를 제거 할 수 있습니다. 합리적으로 큰 테이블 (예 : 수십만 개의 레코드)에 대해 쿼리 할 때 상당한 성능 영향을 미칠 수 있지만 직원 테이블은 일반적으로 비교적 작기 때문에 성능 영향은 상대적으로 적습니다. –

7

이 시도 할 필요가있다.

편집 :이 같은 순수한 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') 

당신을 위해 가장 적합한 쪽을 선택합니다.