0

У меня есть запрос, который даст мне доступ каждого пользователя идентифицированного UserID:Как создать процедуру из выбранного запроса

Моего запроса:

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

и я хочу, чтобы сделать процедуру для этого запроса и сохранить результат, что в полосе отвода и вызвать эту процедуру в программном обеспечении, как IBM Message Broker в ESQL

Я использую эту процедуру, но не подходящий результат:

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, a.allowread из thp.tbaction а, thp.tbaction_profile ар, thp.tbprofile р, thp.tbuser у , где a.actionid = ap.actionid и ap.profid = p.profid и p.profid = u.profid и u.userid = P_USERID

  2. Вам не нужно совершать после оператора выбора.

  3. У вас есть несколько способов возврата результатов от вашей процедуры:

Ref Cursor

это будет работать, только если ваше приложение знает, как обращаться с курсоров. 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

create global temporary table temp_select_action_result 
as 
    select a.actionid,a.actionname,a.allowwrite,a.allowread 
    from thp.tbaction a 
    where 1 = 0 

procedure select_action (
    p_userid in  number) 
is 
begin 
    insert into temp_select_action_result 
     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; 
end; 

 Смежные вопросы

  • Нет связанных вопросов^_^