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 回答