最佳实践是尝试创建角色,然后在发生异常时优雅地处理适当的异常;这意味着您不需要运行可能昂贵的数据字典查询:
begin
execute immediate 'create role role_name';
exception
when others then
--"ORA-01921: role name 'x' conflicts with another user or role name"
if sqlcode = -01921 then
null;
else
raise;
end if;
end;
Run Code Online (Sandbox Code Playgroud)
是的,您需要 PL/SQL 来完成这项工作 - 无论如何,它是完成这项工作的最佳工具。
解决方案
给定答案和编译指示控件的组合可为 Oracle 10g 完成此任务。
CREATE OR REPLACE PROCEDURE create_role( role_name IN VARCHAR2 ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE 'CREATE ROLE '||role_name;
EXCEPTION
WHEN OTHERS THEN
-- ORA-01921: If The role name exists, ignore the error.
IF SQLCODE <> -01921 THEN
RAISE;
END IF;
END create_role;
Run Code Online (Sandbox Code Playgroud)
测试
此序列有效:
DROP ROLE role_name;
CREATE ROLE role_name;
CALL create_role( 'role_name' );
CALL create_role( 'role_name' );
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,最终的 create role 语句失败:
DROP ROLE role_name;
CALL create_role( 'role_name' );
CREATE ROLE role_name;
Run Code Online (Sandbox Code Playgroud)