0

선택 쿼리에서 프로 시저를 만들어떻게 나에게 확인 된 사용자 ID로 각 사용자의 액세스를 제공하는 쿼리가

SELECT A.ACTIONID,A.ACTIONNAME,A.ALLOWWRITE,A.ALLOWREAD 
             FROM THP.TBACTION A 
             WHERE A.ACTIONID IN (SELECT AP.ACTIONID 
             FROM THP.TBACTION_PROFILE AP 
             WHERE AP.PROFID IN(SELECT P.PROFID 
             FROM THP.TBPROFILE P 
             WHERE P.PROFID IN(SELECT U.PROFID 
                FROM THP.TBUSER U 
                WHERE U.USERID='1'))); 

을 나는이 쿼리에 대한 절차를 만들고 싶어 그리고 ROW에 그 결과를 저장하고 내가이 절차가 아니라 적절한 결과 사용

ESQL

에서 IBM 메시지 브로커와 같은 소프트웨어에서이 프로 시저를 호출 :

create or replace 
PROCEDURE  SELECT_ACTION (
    P_USERID IN  NUMBER, 

    RESULT  OUT  NUMBER)IS 
CNT NUMBER; 
BEGIN 
    RESULT := 1; 
    CNT := 0; 
    SELECT COUNT(1) INTO CNT FROM THP.TBUSER WHERE USERID = P_USERID ;--AND SERIALTOKEN= P_SERIALTOKEN; 

    IF CNT = 1 THEN 
     BEGIN 
      SELECT A.ACTIONID,A.ACTIONNAME,A.ALLOWWRITE,A.ALLOWREAD 
             FROM THP.TBACTION A 
             WHERE A.ACTIONID IN (SELECT AP.ACTIONID 
             FROM THP.TBACTION_PROFILE AP 
             WHERE AP.PROFID IN(SELECT P.PROFID 
             FROM THP.TBPROFILE P 
             WHERE P.PROFID IN(SELECT U.PROFID 
                FROM THP.TBUSER U 
                WHERE U.USERID=P_USERID))); 
     COMMIT; 
     RESULT :=0; -- ROW was Found  
     END; 

    END IF; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     RESULT := 3; 
    WHEN OTHERS THEN 
     RESULT := 4; 
END SELECT_ACTION; 

저를 도와주세요.

답변

0
  1. 하위 선택 대신 내부 조인으로 쿼리를 다시 작성할 수 있습니다.

    선택 a.actionid, a.actionname, a.allowwrite가 thp.tbaction에서, thp.tbaction_profile의 AP, thp.tbprofile p를 thp.tbuser을 을 a.allowread 여기서 U = a.actionid ap.actionid 및 ap.profid = p.profid 및 p.profid = u.profid 및 u.userid = P_USERID

  2. 당신은 선택 문 다음에 커밋 할 필요가 없습니다.

참조 커서

응용 프로그램이 커서를 처리하는 방법을 알고있는 경우에만 동작합니다 :

  • 당신은 프로 시저에서 결과를 반환하는 몇 가지 방법이있다. jdbc \ odbc가 있습니다.

    create or replace function select_action (
        p_userid in  number) 
    is 
        result sys_refcursor; 
    begin 
        open result for 
         select a.actionid,a.actionname,a.allowwrite,a.allowread 
         from thp.tbaction a , 
           thp.tbaction_profile ap , 
           thp.tbprofile p, 
           thp.tbuser u 
         where a.actionid = ap.actionid 
         and  ap.profid = p.profid 
         and  p.profid = u.profid 
         and  u.userid=P_USERID; 
    
        if not result%found then 
         raise_application_error(-20001 , 'user ' || p_userid ||' not found') 
        end if; 
    
        return result; 
    end; 
    

    임시 테이블

    당신은 글로벌 임시 테이블에 결과를 삽입합니다. 응용 프로그램이 결과를 원할 때 함수를 활성화 한 다음 user_id를 사용하여 결과 임시 테이블을 쿼리합니다.