我尝试从希腊字母表中创建前缀为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"必须声明为""。如何正确执行此操作?
1条答案
按热度按时间qyswt5oh1#
您的代码基本正确。但是,您需要使用
REGEXP_SUBSTR
函数将逗号分隔的值列表拆分为一个数组,以便循环遍历列表中的每个元素。关于错误“PLS-00201:必须声明标识符“LIST””表示未声明代码中使用的LIST
变量。未正确声明或初始化变量时通常会发生此错误。在代码中,必须先声明LIST
变量,然后才能使用它。可以在代码开头使用DECLARE
命令来执行此操作,如下所示:下面是对我的代码的一个很好的解释:
代码的第一行是一个
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函数从列表中提取每一项并动态创建用户。