运行此 SQL 块时,我收到 ORA-00922“缺少或无效选项”,但无法找出原因。我尝试寻找特定的语法错误(错误的括号),但没有任何效果:
DECLARE
v_original_profiles SYS.ODCIVARCHAR2LIST;
v_original_usernames SYS.ODCIVARCHAR2LIST;
modified_ddl varchar2(400);
username varchar2(100);
BEGIN
SELECT profile, username
BULK COLLECT INTO v_original_profiles, v_original_usernames
FROM dba_users
WHERE profile in ('profile_x');
FOR i IN 1 .. v_original_usernames.COUNT LOOP
EXECUTE IMMEDIATE 'ALTER USER ' || v_original_usernames(i) || ' PROFILE Profile_A';
END LOOP;
FOR r IN (WITH t AS (
SELECT dbms_metadata.get_ddl('USER', username) ddl
FROM dba_users
WHERE profile in 'Profile_A' OR username IN (SELECT username FROM smith.emp))
SELECT REPLACE(SUBSTR(ddl, 1, INSTR(ddl, 'DEFAULT') - 1), 'CREATE', 'ALTER') || ';' AS modified_ddl
FROM t)
LOOP
BEGIN
EXECUTE IMMEDIATE r.modified_ddl;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error executing: ' || r.modified_ddl || '. ' || SQLERRM);
END;
END LOOP;
FOR i IN 1 .. v_original_usernames.COUNT LOOP
EXECUTE IMMEDIATE 'ALTER USER ' || v_original_usernames(i) || ' PROFILE ' || v_original_profiles(i);
END LOOP;
END;
/
第 1 行错误 ORA-06550: 第 9 行,第 5 列: PL/SQL: ORA-00947: 值不足 ORA-06550: 第 7 行,第 5 列: PL/SQL:忽略 SQL 语句
脚本在第 1 行停止。
谢谢!我添加了附加变量并用 dbms_output_line 替换了立即执行,它按预期显示了代码。但是,当转换回执行立即数时,我在第 5 行得到 ora-00922: Missing or invalid option,在第 16 行得到 ORA-06512
第 5 行错误 ORA-00922: 选项缺失或无效 ORA-06512: 在第 15 行
首先注意:认真对待有关动态 SQL 问题的评论中的建议。
其次,你的错误在于使用
v_original_profiles SYS.ODCIVARCHAR2LIST;
。这是一个奇异 VARCHAR2
值的数组。在第一个循环中,您尝试 BULK COLLECT
一个数组值中的两个值。
解决方案:使用2个数组来
BULK COLLECT
你的查询结果。
DECLARE
v_original_profiles SYS.ODCIVARCHAR2LIST;
v_original_usernames SYS.ODCIVARCHAR2LIST;
BEGIN
SELECT profile, username
BULK COLLECT INTO v_original_profiles, v_original_usernames
FROM dba_users
WHERE profile in ('profile_x');
END;