plsql - динамически менять имя таблицы в курсоре - PullRequest
0 голосов
/ 11 мая 2018

Я получаю ошибку ниже при выполнении процедуры. является правильным выбором .. пытается передать имя таблицы в качестве параметра. Просьба помочь.

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 голосов
/ 11 мая 2018

Ваш код PL / SQL имеет много синтаксических ошибок.

  1. Вы можете передать имя таблицы в объявлении курсора в виде "from p_table_name".
CURSOR unique_id_cur
IS
SELECT /*PARALLEL(20)*/ unique_id
FROM   p_table_name;
  1. Если вы используете тип данных "VARCHAR2", вы должны указать, что длина данных должна содержать переменную. Также строка «ora11g / test /» должна храниться в одинарной квоте, как «ora11g / test / '

V_file_parm Varchar2: = ora11g / test /;

  1. Каталог, который вы передаете, не уверен, будет ли он принимать или нет. Но следует создать логическую форму непосредственно в Oracle с помощью «CREATE DIRECTORY», а затем передать новый каталог, созданный в «UTL_FILE.FOPEN».

Вот пример идеи создания процедуры, которая будет компилироваться и работать для вас, создания или реальной процедуры, как показано ниже.

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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...