运行 plsql 块时出现丢失或无效选项错误

问题描述 投票:0回答:1

运行此 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 oracle plsql
1个回答
0
投票

首先注意:认真对待有关动态 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;
© www.soinside.com 2019 - 2024. All rights reserved.