2016-03-25 6 views
0

Пожалуйста, проверьте мою процедуру. Я получил ошибку, когда попытался передать строку в процедуру. Он работал нормально, если я передаю номер.PLS-00201: идентификатор 'D' должен быть объявлен

DECLARE 
    x number(2); 
    name varchar2(333); 
    PROCEDURE hello(id IN OUT Number, name in varchar2) 
    IS 
     i number(2):= 1; 
     mName varchar2(3000):='jjjj'; 
    BEGIN 
     dbms_output.put_line('This line is in procedure'); 
     while i < id 
     loop 
      mName:= '' || ' ohlla';   
      dbms_output.put_line('Id is ' || i || ' name ' || mName); 
      i:=i+1; 
     end loop; 
    END; 
BEGIN 
    x := &id; 
    name:= &somename; 
    hello(x, name); 
    dbms_output.put_line('Last line is id= ' || x || ' Finished '); 

END; 
/

ответ

2

Вам не хватает кавычек при присвоении строковой переменной; попробуйте:

name:= '&somename'; 

Таким образом, он будет работать с числовыми идентификаторами и буквальными именами; если вам нужны литеральные идентификаторы, вам нужно изменить тип переменной x и добавить квоты в присваивании также x.

0

Предпочтительное решение - внести изменения, предложенные Aleksej в ваш код (поместите здесь & somename в задание).

Обходной путь, который вам может понадобиться, если вы не можете изменить процедуру (например, если вы ее не владеете или если другие процедуры могут зависеть от этого, и они могут сломаться, если вы вносите изменения, даже если это изменение, чтобы сделать эту процедуру лучше), чтобы передать строку в процедуру с кавычками, например, так:

SQL> введите значение для & SomeName: 'Мэри

замена переменных замещены verbatim, поэтому вам нужны кавычки для varchar2 (в одном и только одном месте, либо в коде, либо в присвоение переменной замещения & имени, за пределами процедуры).

Это настоящая процедура, которую вы написали, или вы используете ее как пример? Я спрашиваю, потому что я не видел, где вы используете входную переменную «name» во внутренней процедуре.

И, чтобы уточнить сообщение об ошибке: Если вы передадите mary (без кавычек), когда компиляция попадает в оскорбительное присваивание, компилятор предполагает, что mary - это имя другой переменной (поскольку это не литерал символа); но он не знает переменной с именем mary, поэтому она вызывает исключение, которое вы видели. Компилятор не догадывается правильно, какова фактическая ошибка (отсутствующие кавычки).

Смежные вопросы