PL / SQL - 在for循环中使用参数

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

我认为问题是我在定义嵌套for循环时不能调用for循环参数。附加的错误。

我正在尝试编写一个存储过程来在线重组索引表空间。我在FOR循环中使用参数时遇到问题。如何让我的FOR循环使用参数:

    create or replace procedure REORGANIZE_MASTER AS

      v_stmt varchar2(600);
      v_stmt2 varchar2(600);
      v_stmt3 varchar2(600);
      v_stmt4 varchar2(600);

    begin
      for i in (SELECT LTRIM(username, 'USR_') CUST_SCHEMA
                  FROM dba_users
                 WHERE username LIKE 'USR_S%')
      loop

        v_stmt:='CREATE BIGFILE TABLESPACE REB_'||i.CUST_SCHEMA;
        dbms_output.put_line(v_stmt);
        --execute immediate v_stmt;

          for i in (SELECT index_name FROM dba_indexes WHERE owner = '||i.CUST_SCHEMA||')
          loop
            v_stmt2:= 'alter i.index_name rebuild online tablespace REB_'||i.CUST_SCHEMA;
            dbms_output.put_line(v_stmt2);
            --execute immediate v_stmt2;
          end loop;

        v_stmt3:='drop tablespace IDX_'||i.CUST_SCHEMA||' including contents and datafiles;';
        dbms_output.put_line(v_stmt3);
        --execute immediate v_stmt3;

        v_stmt4:='alter tablespace REB_'||i.CUST_SCHEMA||' rename to IDX_'||i.CUST_SCHEMA;
        dbms_output.put_line(v_stmt4);
        --execute immediate v_stmt4;

      end loop;
    end;
    /

    show errors
    exit


    Errors for PROCEDURE REORGANIZE_MASTER:

    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    20/17    PL/SQL: Statement ignored
    20/82    PLS-00302: component 'CUST_SCHEMA' must be declared
oracle plsql oracle11g
1个回答
3
投票

你创建了两个循环,都有一个名为i的循环变量,一个嵌套在另一个循环中。在内部循环中,“外部”变量名称i被赋予内部循环变量的相同名称掩盖,因此内部循环中不存在i.CUST_SCHEMA。 (它仍然存在于外部循环中 - 错误与内部循环中使用的i.CUST_SCHEMA有关。)

你的第二个循环需要另一个循环变量名,它还需要以不同的方式使用/连接两个循环中的值 - 你当前正在寻找文字值||i.CUST_SCHEMA||所拥有的索引,而不是该游标字段的值:

  -- call the second loop variable j instead of i (or something more meaningful...)
  -- refer to the schema name directly, not as a text literal
  for j in (SELECT index_name FROM dba_indexes WHERE owner = i.CUST_SCHEMA)
  loop
    -- concatenate in the index name from the j loop
    -- include the 'index' keyword in the alter statement
    v_stmt2:= 'alter index ' || j.index_name
      || ' rebuild online tablespace REB_'||i.CUST_SCHEMA;
    dbms_output.put_line(v_stmt2);
    --execute immediate v_stmt2;
  end loop;
© www.soinside.com 2019 - 2024. All rights reserved.