如何在oracle中从列表创建用户?

pb3skfrl  于 2023-02-15  发布在  Oracle
关注(0)|答案(1)|浏览(127)

我尝试从希腊字母表中创建前缀为sit的用户,比如sit-alpha,sit-beta等等。
这是我目前掌握的情况:

BEGIN
  LIST:= 'alpha, beta, gamma';
  FOR u IN LIST

  LOOP

    EXECUTE IMMEDIATE 'CREATE USER SIT-' || TO_CHAR (U)||' IDENTIFIED BY
CLERK'||TO_CHAR (U) ;

    EXECUTE IMMEDIATE 'GRANT CONNECT, RESOURCE TO SIT-'||TO_CHAR(U);

  END LOOP;

END;

但上面写着"PLS-00201:标识符"LIST"必须声明为""。如何正确执行此操作?

qyswt5oh

qyswt5oh1#

您的代码基本正确。但是,您需要使用REGEXP_SUBSTR函数将逗号分隔的值列表拆分为一个数组,以便循环遍历列表中的每个元素。关于错误“PLS-00201:必须声明标识符“LIST””表示未声明代码中使用的LIST变量。未正确声明或初始化变量时通常会发生此错误。在代码中,必须先声明LIST变量,然后才能使用它。可以在代码开头使用DECLARE命令来执行此操作,如下所示:

DECLARE
      LIST VARCHAR2(200) := 'alpha, beta, gamma';
    BEGIN
      FOR u IN (SELECT trim(regexp_substr(LIST, '[^,]+', 1, LEVEL)) AS val FROM dual
                CONNECT BY LEVEL <= regexp_count(LIST, ',') + 1)
    
      LOOP
        EXECUTE IMMEDIATE 'CREATE USER SIT-' || u.val || ' IDENTIFIED BY CLERK' || u.val;
        EXECUTE IMMEDIATE 'GRANT CONNECT, RESOURCE TO SIT-' || u.val;
      END LOOP;
    END;

下面是对我的代码的一个很好的解释:
代码的第一行是一个DECLARE命令,它指示变量声明部分的开始,该部分声明了将在代码的其余部分中使用的所有变量和常量。
第二行声明VARCHAR2类型的LIST变量,最大长度为200个字符。此变量包含您要创建的用户名的逗号分隔列表。
第三行是BEGIN命令,指示可执行代码块的开始。
第四行开始一个FOR循环,该循环使用SELECT查询遍历用户名列表中的每一项。
SELECT查询使用regexp_substr函数检索列表中每个逗号分隔的项,并将其作为val返回。trim函数用于删除列表中每个元素周围可能存在的任何不必要的空格。CONNECT BY子句用于生成FOR循环遍历列表中每个元素所需的行。
FOR循环使用变量u在每次迭代时存储列表中的每个元素。
FOR循环中的两个EXECUTE IMMEDIATE命令使用用户名SIT-后跟值val创建一个新用户,然后为该用户添加CONNECT和RESOURCE权限。
最后,代码的最后一行是END命令,它指示可执行代码块的结束。
总之,此代码从用户名列表中提取每一项,创建一个名称包含该项的新用户,然后为该用户添加CONNECT和RESOURCE权限。此代码使用Oracle函数从列表中提取每一项并动态创建用户。

相关问题