plsql - 动态更改游标中的表名

时间:2018-05-11 13:15:40

标签: sql oracle plsql

我在运行程序时遇到错误。选择正确..尝试将表名作为参数传递。请帮助。

PLS-00364:循环索引变量'CURSOR1'使用无效

  PROCEDURE generate_uniqueId(p_table_name IN VARCHAR2)  is
  --
  --
  CURSOR unique_id_cur
   IS
    SELECT /*PARALLEL(20)*/ unique_id
    FROM   p_table_name;

--
        v_file          UTL_FILE.file_type;
        V_file_name     Varchar2 (150);
    V_file_parm     Varchar2:= ora11g/test/;
    v_output    varchar2(200);


  BEGIN
         v_file_name := p_table_name || '.lst';
        v_file := UTL_FILE.fopen ('ora11g/test/', 'unique_ID_file', 'A');
        FOR cursor1 IN unique_id_cur
        LOOP
                BEGIN
                v_output := cursor1.unique_id;
                UTL_FILE.put_line (v_file, v_output);
                END;
        END LOOP;
        UTL_FILE.fflush (v_file);
        UTL_FILE.fclose (v_file);
  END generate_uniqueId ;

1 个答案:

答案 0 :(得分:0)

您的PL / SQL代码有很多语法问题。

  1. 您可以在游标声明中以“from p_table_name”。
  2. 的形式传递表名
    CURSOR unique_id_cur
    IS
    SELECT /*PARALLEL(20)*/ unique_id
    FROM   p_table_name;
    
    1. 如果您使用的是“VARCHAR2”数据类型,那么您必须提供应包含变量的数据长度。字符串“ora11g / test /”应保存在单个配额中 - ' - as'orarg / test /'
    2.   

      V_file_parm Varchar2:= ora11g / test /;

      1. 您要传递的目录,我不确定它是否会接受。但是,应该使用“CREATE DIRECTORY”在Oracle中直接创建逻辑,然后传递在“UTL_FILE.FOPEN”中创建的新目录。
      2. 以下是创建过程的示例构思,该过程将为您编译和工作,创建或实际过程如下。

        create or replace  PROCEDURE generate_uniqueId(p_table_name IN VARCHAR2 default 'abc')
        as
        CURSOR unique_id_cur
           IS
            SELECT object_id as unique_id
            FROM   all_tables
            where rownum <=5;
        
            v_file          UTL_FILE.file_type;
            V_file_name Varchar2(150);
            V_file_parm Varchar2(200) := 'ora11g/test/';
            v_output varchar2(200);
        
          BEGIN
               v_file_name := p_table_name || '.lst';
               v_file := UTL_FILE.fopen ('ora11g/test/', 'unique_ID_file', 'A');
                FOR cursor1 IN unique_id_cur
                LOOP
                        BEGIN
                        v_output := cursor1.unique_id;
                        UTL_FILE.put_line (v_file, v_output);
                        END;
                END LOOP;
                UTL_FILE.fflush (v_file);
                UTL_FILE.fclose (v_file);
          END generate_uniqueId ;
        

        EDIT-1

        create or replace  PROCEDURE generate_uniqueId(p_table_name IN VARCHAR2 default 'abc')
        as
        type t1 is table of varchar2(255) index by pls_integer;
        v_unique_ids t1;
        v_sql varchar2(4000);
            v_file          UTL_FILE.file_type;
            V_file_name Varchar2(150);
            V_file_parm Varchar2(200) := 'ora11g/test/';
            v_output varchar2(200);
        
          BEGIN
               v_file_name := p_table_name || '.lst';
               v_file := UTL_FILE.fopen ('ora11g/test/', 'unique_ID_file', 'A');
        
            v_sql := 'select /* PARALLEL(20) */ unique_id  from '|| p_table_name;
            execute immediate v_sql bulk collect into v_unique_ids;
        
                FOR cursor1 IN v_unique_ids.first..v_unique_ids.last
                LOOP
                        BEGIN
                        v_output := v_unique_ids(cursor1);
                        UTL_FILE.put_line (v_file, v_output);
                        END;
                END LOOP;
                UTL_FILE.fflush (v_file);
                UTL_FILE.fclose (v_file);
          END generate_uniqueId ;