2014-01-07 5 views
0

Следующий код работает как ожидалось в SQL Developer без каких-либо ошибок, но когда я запускаю код в SQL * Plus, он выдает ошибку.Разница в исполнении SQL Developer и SQL * Plus

declare 
     v_num1 integer := '&a'; 
     v_num2 integer := '&b'; 
     v_result number; 
    begin 
     v_result := v_num1/v_num2; 
     dbms_output.put_line ('v_result: '||v_result); 
    end; 

Ошибка поднятый является

ERROR at line 1: 
ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at line 2 

Пожалуйста, укажите, где ошибка я сделал.

+0

Какие значения вы дадите для 'a' и' b' в обоих случаях; и почему вы цитируете их в задании, если они являются цифрами? Если значения имеют разделители групп или десятичных чисел (хотя десятичные значения не имеют смысла, если они являются целыми числами), являются ли ваши настройки NLS одинаковыми, особенно NLS_NUMERIC_CHARACTERS? –

+0

@AlexPoole Вы можете указать, как проверить настройки «NLS_NUMERIC_CHARACTERS». Когда я искал сеть, они предоставляют команды для изменения характера. Что такое команда для проверки текущего символа. – ethan

+1

'select value from nls_session_parameters где параметр = 'NLS_NUMERIC_CHARACTERS';'. Это имеет смысл только в том случае, если вы вводите значение с разделителем, например. '1,001' или' 1.001', а не просто '1001'. Этот параметр NLS определит, будет ли он интерпретироваться как тысяча и один, или один, и немного. Это то, что вы делаете? Это может объяснить ошибку - если вы передаете разделитель групп, вы получите эту ошибку. Пожалуйста, покажите, какие значения вы используете. –

ответ

1

В сеансе 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 среди других параметров конфигурации. вероятно, это происходит по какой-то причине, но если у вас есть только профиль сайта, вы можете создать свой собственный профиль пользователя, чтобы переопределить это. Просто помните о влиянии всего, что вы измените; у вас могут быть другие сценарии, которые полагаются на то, что он выключен, например. если у вас есть данные, у которых есть амперсанды, и он был отключен, чтобы предотвратить проблемы, интерпретирующие их.

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