Идентификатор должен быть объявлен? Ошибка PL / SQL - PullRequest
7 голосов
/ 25 марта 2012

Это программа, которую я написал:

set serveroutput on;
declare
  b empl.name1%type;
  r varchar;   --can i change this to r empl.designation%type; ?
begin
  r:=&designation;                      --getting input for the designation
  dbms_output.put_line('hello');            --random output to check for errors
  select name1 into b from empl where designation=r;   --i want all the names from the table
  dbms_output.put_line('name'||b);                   --employee where designation is as entered
  dbms_output.put_line(' closed');                 --by user,should i loop this statement?
end;

Когда я вписываю обозначение как 'a' (которое уже введено в таблицу), я получаю ошибку identifier 'a' is not declared.Что это значит?Оператор select занимает по одной строке за раз?Так что, если я зациклюсь, получу ли я все строки?Или я должен использовать курсор?Почему SQL Developer не принимает %rowtype?

Я изменил свою программу на это:

set serveroutput on;
declare
  cursor cempl is select name1,designation from empl;
  b empl.name1%type;
  des empl.designation%type;
  r empl.designation%type;
begin
  r:='meow';
  dbms_output.put_line('hello');
  open cempl;
  if cempl%ISOPEN then
    loop
      fetch cempl into b,des;
      if des=r then
        dbms_output.put_line('name'||b);
      end if;
      exit when cempl%notfound;
    end loop;
    close cempl;
    dbms_output.put_line(' closed');
  end if;
end;

Всякий раз, когда я получаю ввод, такой как r:=&r, и представляю, что я ввожу 'a', он говоритидентификатор 'a' должен быть объявлен, но его значение в таблице!Почему это должно быть объявлено, но если оно указано в программе, как указано выше, это не выдает ошибку.Вместо этого он дважды повторяет последний ряд!

Ответы [ 2 ]

8 голосов
/ 25 марта 2012

Здесь можно ответить на несколько вопросов:

  • Ошибки «Идентификатор не найден»: &designation - переменная замещения SQL * Plus. Когда вы вводите значение для &designation, SQL * Plus заменяет &designation текстом того, что вы ввели. Итак, если вы введете vaue a, строка

    r:=&designation;
    

    становится

    r:=a;
    

    Ошибка возникает из-за того, что Oracle не знает ничего под названием a. Вы не объявили переменную с именем a, и нет процедуры, функции или чего-либо еще, что можно было бы найти с именем a. Если вы хотите, чтобы конечный результат был r:='a';, вам нужно написать r:='&designation';

  • SELECT ... INTO ... работает, только если запрос возвращает ровно одну строку. Если строки не возвращаются, вы получите ошибку no data found, а если будет возвращено более одной строки, вы получите ошибку too many rows. Вы должны использовать SELECT ... INTO ..., только если знаете, что будет только один результат. Если может быть более одного результата, вы должны использовать курсор.

  • 'Почему SQL Developer не принимает %rowtype'? Это должно сделать - не могли бы вы привести пример, который вызывает проблемы для вас?

  • Во втором примере повторяется последняя строка, потому что вы не выходите из цикла сразу после того, как курсор не может найти больше строк. Вы должны переместить строку exit when сразу ниже линии fetch.

4 голосов
/ 25 марта 2012

Заглянул в тебя первый скрипт:

set serveroutput on;
declare
  b empl.name1%type;
  r empl.designation%type;   -- made a change here 
begin
  r:='&designation';                      --made a change here
  dbms_output.put_line('hello');            
  select name1 into b from empl where designation=r;   
  dbms_output.put_line('name'||b);                  
  dbms_output.put_line(' closed');                 
end;
  1. если вы объявляете r как varchar2, вам нужно установить длину, то есть - varchar2(32)
  2. Когда вы присваиваете значение r, оно должно включать ', поэтому вы можете либо поместить его в скрипт (как в коде выше, либо вы можете присвоить designation значение, содержащее ', например, как 'a'

Я попробовал код выше из sql * plus, и он работает


Что происходит, если после ввода a для &designation (без ') ваш код выглядит следующим образом:

r:=a;

, поскольку нет идентификатора a, запускается исключение

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