다음 표가 있습니다.
id name score
1 SYS 4
2 RHWTT 5
3 LEO 4
4 MOD3_ADMIN 5
5 VPD674 4
6 SCOTT 5
7 HR 4
8 OE 5
9 PM 4
10 IX 5
11 SH 4
12 BI 5
13 IXSNEAKY 4
14 DVF 5
Oracle SQL에서 다음 사항을 확인하는 정책 함수를 만들고 싶습니다.
3 LEO 4
.Scott이 만든이 테이블에 대해 Leo에게 선택 권한을 부여했습니다.
이 복잡한 PL / SQL 함수를 작성하는 데 어려움을 겪고 있습니다. 다음을 시도했는데 컴파일 오류가 표시됩니다. 또한 내가하려는 일을하지 않는다고 생각합니다.
CREATE FUNCTION no_show_all (
p_schema IN NUMBER(5),
p_object IN VARCHAR2
)
RETURN
AS
BEGIN
RETURN 'select avg(score) from scott.rating';
END;
/
이전 질문과 게시 한 정보를 기반으로 질문을 이해 한 방법은 다음과 같습니다 select
. 전체 테이블에 대해 모든 사용자 에게 권한 을 부여한 경우 모든 행 을 가져올 수 있습니다. 값을 더 제한해야합니다.
함수에 대해 이야기하고있는 한 가지 옵션은 case
in where
절 을 사용하는 것 입니다 .
여기에 예가 있습니다.
샘플 데이터 :
SQL> create table rating as
2 select 1 id, 'sys' name, 4 score from dual union all
3 select 3, 'leo' , 3 from dual union all
4 select 6, 'scott' , 5 from dual union all
5 select 7, 'hr' , 2 from dual;
Table created.
함수:
upper
함수 나 이와 비슷한 것을 사용해야 할 것입니다)case
말한다 : par_user
이 같으면 sys
모든 행을 가져 오도록합니다. 그렇지 않으면 이름 열의 값이 다음과 같은 행만 가져옵니다.par_user
그래서:
SQL> create or replace function f_rating (par_user in varchar2)
2 return number
3 is
4 retval number;
5 begin
6 select avg(score)
7 into retval
8 from rating
9 where name = case when par_user = 'sys' then name
10 else par_user
11 end;
12 return retval;
13 end;
14 /
Function created.
해 보자:
SQL> select f_rating('sys') rating_sys,
2 f_rating('hr') rating_hr
3 from dual;
RATING_SYS RATING_HR
---------- ----------
3,5 2
SQL>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다