使用循环的 Oracle Apex 过程

Oracle Apex procedure using loop

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

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

因此,select 查询没有 returning 任何值。

select 查询应该 return 通过从循环中获取电子邮件 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。

哦,孩子。我想高级会员/版主不会对此 "answer" 太满意,但不可能将所有内容都放入 600-characters long 评论中。没错,我可以将评论缩短为 "this is sh*t",但这对任何人都没有帮助。不过,"rules" 会被遵守。所以,如果最后发现这条消息被删除了,对不起大家。

给你。

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

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

光标 FOR loop 是实现此目的的方法;但是,从 SELECT 中删除 INTO clause,它不属于这里。

L_USER 是所有 REQUESTOR_NAMEs return 由游标编辑的串联。这意味着你不应该在 SELECT GROUP_IDSELECT USER_ID 语句中使用它,因为它肯定不会 return 任何东西(也许 something 第一个循环迭代,但其余部分没有)。看起来您更愿意使用 I.REQUESTORS_NAME。另外,一旦你对它应用 LOWER 函数,然后你就不用了 - 考虑让它统一。

你为什么selectGROUP_ID?你以后再也不用它了。

L_NOT_PROVISIONED_USERS 是重复项的巨大串联,因为您将以前的值与 L_USER(又一个串联)串联起来。试试DBMS_OUTPUT吧,你就知道了。

您不关心那些 SELECT 可能会引发的可能 NO-DATA-FOUND,因为 - 正如我已经说过的 - 他们不会 return后续循环迭代中的任何内容。

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

所以,这真是一团糟...尝试按照我写的内容,清楚地了解您想要得到的结果,去 step-by-step,经常测试并且 - 希望如此- 你会得到一些有用的东西。

按如下操作:

 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;