В сеансе SQL * Plus отключены переменные замещения, поэтому '&a'
обрабатывается как буквальная строка и не запрашивает значение. В упрощенной версии:
set define off
declare
i integer := to_number('&a');
begin
null;
end;
/
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 2
Чтобы исправить это, включите переменные подстановки обратно:
set define &
Тогда это работает:
declare
i integer := to_number('&a');
begin
null;
end;
/
Enter value for a:
Если я ввожу 1:
PL/SQL procedure successfully completed.
Вам не нужны кавычки или to_number()
, если вы не используете разделителей групп (и тогда вам также потребуется указать модель формата). Вы можете просто сделать:
declare
i integer := &a;
begin
null;
end;
/
Как вы его вы делаете ненужное неявное преобразование строк в-номер.
Если вы явно не отключили их, у вас, вероятно, есть site or user profile, который делает set define off
среди других параметров конфигурации. вероятно, это происходит по какой-то причине, но если у вас есть только профиль сайта, вы можете создать свой собственный профиль пользователя, чтобы переопределить это. Просто помните о влиянии всего, что вы измените; у вас могут быть другие сценарии, которые полагаются на то, что он выключен, например. если у вас есть данные, у которых есть амперсанды, и он был отключен, чтобы предотвратить проблемы, интерпретирующие их.
Какие значения вы дадите для 'a' и' b' в обоих случаях; и почему вы цитируете их в задании, если они являются цифрами? Если значения имеют разделители групп или десятичных чисел (хотя десятичные значения не имеют смысла, если они являются целыми числами), являются ли ваши настройки NLS одинаковыми, особенно NLS_NUMERIC_CHARACTERS? –
@AlexPoole Вы можете указать, как проверить настройки «NLS_NUMERIC_CHARACTERS». Когда я искал сеть, они предоставляют команды для изменения характера. Что такое команда для проверки текущего символа. – ethan
'select value from nls_session_parameters где параметр = 'NLS_NUMERIC_CHARACTERS';'. Это имеет смысл только в том случае, если вы вводите значение с разделителем, например. '1,001' или' 1.001', а не просто '1001'. Этот параметр NLS определит, будет ли он интерпретироваться как тысяча и один, или один, и немного. Это то, что вы делаете? Это может объяснить ошибку - если вы передаете разделитель групп, вы получите эту ошибку. Пожалуйста, покажите, какие значения вы используете. –