Oracle Apex程序使用循环

时间:2017-12-28 07:26:15

标签: oracle stored-procedures oracle-sqldeveloper oracle-apex-5

我正在尝试为个人用户获取user_idgroup_id

我已经在循环中使用了用户的电子邮件,因为有很多用户在那里,但我需要循环逐个采取,目前它采取所有邮件ID:abinnaya.moorthy@abc.com,abinnaya.moorthy@def.com

因此,select查询不会返回任何值。

select查询应该通过从循环中获取电子邮件ID逐个返回值。

代码:

DECLARE    
    L_USERS  varchar2(1000);
    l_org_group_id varchar2(1000);
    l_user_id varchar2(1000);
    l_api_body varchar2(1000);
    l_retry_after number;
    l_status number;
    L_NOT_PROVISIONED_USERS varchar2(1000);
    l_success boolean;
    l_user varchar2(1000);
BEGIN

  FOR I IN
    (Select REQUESTORS_NAME into L_USER 
    from Request 
    where Request_Status = 'Approved' 
    and Provisioning_Status is NULL )
  LOOP
    L_USER:= L_USER ||','||I.REQUESTORS_NAME;

    select GROUP_ID INTO l_org_group_id 
    from WORKSPACE_GROUP 
    where LOWER(email)=(L_USER);

    select USER_ID into l_user_id 
    from slackdatawarehouse.users
    where lower(email) = lower(L_USER);  

    DBMS_OUTPUT.PUT_LINE(l_user_id);

    if l_user_id is null then
       l_not_provisioned_users := l_not_provisioned_users||','|| L_USER;
    else
       l_api_body := l_api_body || '{"value" :"'||l_user_id ||'"},'; 
       l_users := l_users||','||l_user_id;

    end if;
  end loop;

end;

帮助我逐个获取用户的电子邮件,并在select查询中传递以获取groupid和用户ID。

2 个答案:

答案 0 :(得分:0)

哦,伙计。我认为高级会员/主持人对这个“答案”不会太满意,但不可能将所有内容都放在600-characters long评论中。没错,我可以将评论家缩短为“这就是sh * t”,但这对任何人都无济于事。虽然,“规则”将被遵守。所以,如果结果是这条消息被删除了,抱歉,大家。

你走了。

很难猜出你想得到什么结果。你谈到Apex,但是 - 这段代码与它有什么关系? DBMS_OUTPUT肯定不会在那里工作。

然后,在DECLARE部分中,使用从未使用过的3 variables - 删除它们。

光标FOR loop是这样做的方法;不过,请从INTO clause移除SELECT,它不属于此处。

L_USER是光标返回的所有REQUESTOR_NAME的串联。这意味着你不应该在SELECT GROUP_IDSELECT USER_ID语句中使用它,因为它肯定不会返回任何内容(可能某些用于第一次循环迭代,但没有任何内容其余的)。看起来好像你宁愿使用I.REQUESTORS_NAME。此外,一旦你对它应用LOWER函数,然后你没有 - 考虑使它统一。

为什么选择GROUP_ID?你以后再也不用了。

L_NOT_PROVISIONED_USERS是重复的巨大连接,因为您将先前的值与L_USER的(另一个连接)连接起来。试着DBMS_OUTPUT,你会看到。

你不关心那些可能由NO-DATA-FOUND提出的SELECT,正如我已经说过的那样 - 他们不会在后续循环迭代中返回任何内容。

最后,即使PL/SQL成功完成,它也不会做任何事情。包括你在内的任何人都不会从中受益。

所以,这非常混乱......试着按照我写的内容,清楚地了解你想要得到的结果,一步一步,经常测试, - 希望 - 你我会得到一些有用的东西。

答案 1 :(得分:-1)

执行以下操作:

 DECLARE
         L_USERS                       VARCHAR2 (1000);
         L_ORG_GROUP_ID                VARCHAR2 (1000);
         L_USER_ID                     VARCHAR2 (1000);
         L_API_BODY                    VARCHAR2 (1000);
         L_RETRY_AFTER                 NUMBER;
         L_STATUS                      NUMBER;
         L_NOT_PROVISIONED_USERS       VARCHAR2 (1000);
         L_SUCCESS                     BOOLEAN;
         L_USER                        VARCHAR2 (1000);

         CURSOR EMAIL_IDS
         IS
              SELECT REQUESTORS_NAME L_USER
                FROM REQUEST
               WHERE REQUEST_STATUS = 'Approved'
                     AND PROVISIONING_STATUS IS NULL;
    BEGIN
         FOR I IN EMAIL_IDS
         LOOP
              SELECT GROUP_ID
                INTO L_ORG_GROUP_ID
                FROM WORKSPACE_GROUP
               WHERE LOWER (EMAIL) = LOWER (I.L_USER);

              SELECT USER_ID
                INTO L_USER_ID
                FROM SLACKDATAWAREHOUSE.USERS
               WHERE LOWER (EMAIL) = LOWER (I.L_USER);

              DBMS_OUTPUT.PUT_LINE (L_USER_ID);

              IF L_USER_ID IS NULL THEN
                   L_NOT_PROVISIONED_USERS :=
                                         L_NOT_PROVISIONED_USERS || ',' || I.L_USER;
              ELSE
                   L_API_BODY :=
                                L_API_BODY || '{"value" :"' || L_USER_ID || '"},';
                   L_USERS := L_USERS || ',' || L_USER_ID;
              END IF;
         END LOOP;
   EXCEPTION
     WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;