зарезервированное слово NUMBER, используемое в качестве имени столбца, вызывающее ошибку при объявлении курсора - PullRequest
4 голосов
/ 08 марта 2012

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

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

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

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

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.

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

Ответы [ 3 ]

1 голос
/ 08 марта 2012

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

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
0 голосов
/ 09 марта 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 );
0 голосов
/ 08 марта 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;

END;

выход

число 1

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...