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

このクエリのプロシージャを作成し、その結果を ROW に保存し、ESQL の IBM Message Broker のようなソフトウェアでこのプロシージャを呼び出したい

私はこの手順を使用しますが、適切な結果ではありません:

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;

助けてください!!!

4

1 に答える 1

0
  1. サブ選択の代わりに内部結合にクエリを書き直すことができます。

    thp.tbaction a 、thp.tbaction_profile ap 、thp.tbprofile p、thp.tbuser u から a.actionid,a.actionname,a.allowwrite,a.allowread を選択します。 a.actionid = ap.actionid および ap.profid = p .profid および p.profid = u.profid および u.userid=P_USERID

  2. select ステートメントの後にコミットする必要はありません。

  3. プロシージャから結果を返すには、いくつかの方法があります。

参照カーソル

これは、アプリケーションがカーソルの処理方法を知っている場合にのみ機能します。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;
于 2013-04-30T06:28:31.440 に答える