зарезервированное слово NUMBER, используемое в качестве имени столбца, вызывающее ошибку с объявлением курсора

... по крайней мере, я думаю, что это проблема.

Я пишу функцию, содержащую объявление курсора, которое обращается к таблице, в которой один из столбцов является зарезервированным словом NUMBER (да, я знаю...). Функция столкнулась с проблемой во время компиляции:

Ошибка (16,10): PL/SQL: ORA-06552: PL/SQL: анализ модуля компиляции прекращен ORA-06553: PLS-488: недопустимое объявление переменной: объект «ЧИСЛО» должен быть типом или подтипом

МОЙ код выглядит примерно так:

CURSOR my_cur 
IS 
    SELECT "NUMBER", col2, col3
    FROM tb1_x; 

Чтобы убедиться, что это проблема, я изменил код на

CURSOR my_cur 
IS 
    SELECT 'NUMBER', 'col2', 'col3'
    FROM dual;  

и он скомпилирован хорошо, но, очевидно, это не то, что я хочу.

К сожалению, у меня нет возможности изменить имя столбца (вздох), и для записи

    SELECT "NUMBER", col2, col3
    FROM tb1_x; 

работает нормально при обычном выполнении SQL.

В любом случае я могу обойти эту проблему? Любая помощь высоко ценится!


person alchn    schedule 08.03.2012    source источник
comment
хвататься за соломинку здесь... но вы пробовали select "NUMBER" as NUMBER или select "NUMBER" as 'NUMBER' или что-то в этом роде?   -  person gangreen    schedule 08.03.2012
comment
@gangreen Я не думаю, что это сработает .. На самом деле, объявление курсора не будет работать во время компиляции, пока используется таблица tb1_x, даже если столбец-виновник NUMBER вообще не имеет доступа. Как показано ниже, произойдет сбой:CURSOR my_cur IS SELECT col2, col3 FROM tb1_x;   -  person alchn    schedule 08.03.2012
comment
Я решаю проблему. Создав представление, чтобы обернуть таблицу преступников, переименовав столбец NUMBER как NBR в представлении. Затем курсор можно объявить с помощью представления и столбца NBR, не упоминая ни исходную таблицу, ни NUMBER. Скомпилировалось нормально и работало нормально.   -  person alchn    schedule 08.03.2012
comment
Можете ли вы создать представление на основе tbl_x, переименовав столбец NUMBER в Num (или что-то в этом роде), а затем select Num as NUMBER from view?   -  person gangreen    schedule 08.03.2012
comment
Окей круто. Рад, что вы решили это.   -  person gangreen    schedule 08.03.2012


Ответы (3)


Мы также можем создать запись, а также использовать столбец в cursor.fetching данных из курсора, что меня удивило, так как я не использовал это раньше.

Create table temp2("number" integer,id integer,name varchar2(200));
insert into temp2 values(1,1,'Gaurav Soni'); 
insert into temp2 values(2,2,'Niharika Saraf');
Commit;


DECLARE
  type abc is record(
  "number" number,
   id       NUMBER,
   name     varchar2(200));

 v_rec abc;
 TYPE v_cur IS REF CURSOR;

 cur    v_cur;
 v_temp INTEGER;
BEGIN
  OPEN cur FOR
     SELECT "number", id, name FROM temp2;
 LOOP
   FETCH cur  INTO v_rec;
    EXIT when cur%notfound;

  DBMS_OUTPUT.put_line('number is ' || v_rec."number");
  DBMS_OUTPUT.put_line('id is ' || v_rec.id);
  DBMS_OUTPUT.put_line('name is ' || v_rec.name);

  end loop;
CLOSE cur;

end;

вывод

number is 1
id is 1
name is Gaurav Soni
number is 2
id is 2
name is Niharika Saraf
person Gaurav Soni    schedule 08.03.2012

Create table temp2("number" integer);
insert into temp2 values(1); 
insert into temp2 values(2);
insert into temp2 values(3);
commit;

DECLARE
TYPE v_cur IS REF CURSOR;

cur      v_cur;
v_temp   INTEGER;
BEGIN
OPEN cur FOR
  SELECT "number"
  FROM   temp2;
FETCH cur
INTO  v_temp;
 DBMS_OUTPUT.put_line ('number is ' || v_temp);
CLOSE cur;

КОНЕЦ;

вывод

номер 1

Я не могу воспроизвести эту проблему, но это нормально для меня.

person Gaurav Soni    schedule 08.03.2012
comment
@это также компилируется, когда я создаю процедуру или функцию - person Gaurav Soni; 08.03.2012

Хм. Структура вашего объявления Cursor немного отличается от моей. Можете ли вы попробовать это:

drop table temp2;
Create table temp2("NUMBER" integer );
insert into temp2 values(1); 
Commit;

CREATE OR REPLACE FUNCTION func1
RETURN VARCHAR2
IS
    l_dummy VARCHAR2(10) := '';

CURSOR cur1 IS
    SELECT *  FROM temp2;

BEGIN    
    FOR a_rec IN cur1
    LOOP
      l_dummy := 'dummy';    
    END LOOP;

    RETURN l_dummy;

END func1;
/
SHOW ERRORS;

Вышеупомянутая ошибка компиляции попадания. Просто измените 2-ю строку, чтобы избавиться от зарезервированного слова, которое мне удалось скомпилировать. Кстати, я использую клиент Oracle SQL Developer, подключающийся к Oracle 10.2 db.

Create table temp2("NUMBERxxx" integer );
person alchn    schedule 09.03.2012