Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
AmKad
Member

Откуда:
Сообщений: 4686
+ Демонстрационный скрипт - будем гонять его на нижеприведенных клиентах
set echo on
set serveroutput on 

alter session set nls_numeric_characters = ",.";

-- 1
select 36.6 from dual;

-- 2
declare
l_num number := 36.6;
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(l_num);
end;
/

-- 3
declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.5 + 0.1);
end;
/

-- 4
declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.6);
end;
/
+ SQL*Plus - все работает как ожидалось
set echo on
set serveroutput on

alter session set nls_numeric_characters = ",.";

Сеанс изменен.

Затрач.время: 00:00:00.00

-- 1
select 36.6 from dual;

      36.6
----------
      36,6

Затрач.время: 00:00:00.00

-- 2
declare
l_num number := 36.6;
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(l_num);
end;
/
36,6

Процедура PL/SQL успешно завершена.

Затрач.время: 00:00:00.00

-- 3
declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.5 + 0.1);
end;
/
36,6

Процедура PL/SQL успешно завершена.

Затрач.время: 00:00:00.00

-- 4
declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.6);
end;
/
36,6

Процедура PL/SQL успешно завершена.

Затрач.время: 00:00:00.00
+ Toad 10.6.1.3 - все работает как ожидалось
SQL> set serveroutput on
SQL> alter session set nls_numeric_characters = ",."
Session altered.
SQL> -- 1
SQL> select 36.6 from dual

      36.6
----------
      36,6
1 row selected.
SQL> -- 2
SQL> declare
l_num number := 36.6;
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(l_num);
end;
36,6
PL/SQL procedure successfully completed.
SQL> -- 3
SQL> declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.5 + 0.1);
end;
36,6
PL/SQL procedure successfully completed.
SQL> -- 4
SQL> declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.6);
end;
36,6
PL/SQL procedure successfully completed.
+ Oracle SQL Developer 4.1.5.21 Build MAIN-21.78 - все работает как ожидалось
SQL> set echo on
SQL> set serveroutput on
SQL> alter session set nls_numeric_characters = ",.";

Session altered.

SQL> -- 1
SQL> select 36.6 from dual;

      36.6
----------
      36,6

SQL> -- 2
SQL> declare
l_num number := 36.6;
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(l_num);
end;
/

PL/SQL procedure successfully completed.

36,6

SQL> -- 3
SQL> declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.5 + 0.1);
end;
/

PL/SQL procedure successfully completed.

36,6

SQL> -- 4
SQL> declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.6);
end;
/

PL/SQL procedure successfully completed.

36,6
+ Oracle SQL Developer 17.3.0.271 Build 271.2323 - неожиданность
SQL> set echo on
SQL> set serveroutput on
SQL> 
SQL> alter session set nls_numeric_characters = ",.";

Session altered.

SQL> 
SQL> -- 1
SQL> select 36.6 from dual;

      36.6
----------
36,6      

SQL> 
SQL> -- 2
SQL> declare
  2  l_num number := 36.6;
  3      procedure PrintNum(p_num number) as
  4      begin
  5          dbms_output.put_line(p_num);
  6      end;
  7  begin
  8      PrintNum(l_num);
  9  end;
 10  /
36,6


PL/SQL procedure successfully completed.

SQL> 
SQL> -- 3
SQL> declare
  2      procedure PrintNum(p_num number) as
  3      begin
  4          dbms_output.put_line(p_num);
  5      end;
  6  begin
  7      PrintNum(36.5 + 0.1);
  8  end;
  9  /
36,6


PL/SQL procedure successfully completed.

SQL> 
SQL> -- 4
SQL> declare
  2      procedure PrintNum(p_num number) as
  3      begin
  4          dbms_output.put_line(p_num);
  5      end;
  6  begin
  7      PrintNum(36.6);
  8  end;
  9  /

Error starting at line : 33 in command -
declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.6);
end;
Error report -
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 7
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.

Запросы 1 - 3 с каждого клиента отрабатывают нормально. Пытаемся понять, почему 4-ый падает на Oracle SQL Developer 17.3.0.
Первый запрос - SQL. С ним проблем не возникло. Все остальное - PL/SQL.

Во 2 запросе мы явно определили переменную number и передаем ее функции. В 3-м запросе, используя операцию сложения, намекаем, что параметр, как результат сложения - число. А вот в 4-м этого намека уже не делаем, и, судя по ошибке, oracle считает, что наш литерал - строка, и на этапе вызова функции пытается преобразовать его в число и спотыкается на nls_numeric_characters.

+ Снимаем трассировку с проблемного вызова и убеждаемся в нашем предположении.
=====================
PARSING IN CURSOR #329891744 len=261 dep=0 uid=48 oct=47 lid=48 tim=793884346175 hv=241631631 ad='7ffd8950cf20' sqlid='9frjtqh76f0cg'
DECLARE SqlDevBind1Z_1 VARCHAR2(32767):=:SqlDevBind1ZInit1;  BEGIN declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(TO_NUMBER( SqlDevBind1Z_1));
end;
 :AUXSQLDBIND1:=SqlDevBind1Z_1;  END;
END OF STMT
PARSE #329891744:c=0,e=41,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=793884346175
BINDS #329891744:
 Bind#0
  oacdty=01 mxl=16386(16000) mxlc=00 mal=00 scl=00 pre=00
  oacflg=03 fl2=1000010 frm=01 csi=873 siz=16392 off=0
  kxsbbbfp=13c77fc0  bln=16386  avl=04  flg=05
  value="36.6"
 Bind#1
  oacdty=01 mxl=16386(16000) mxlc=00 mal=00 scl=00 pre=00
  oacflg=03 fl2=1000010 frm=01 csi=873 siz=16392 off=0
  kxsbbbfp=13bfbff8  bln=16386  avl=04  flg=05
  value="36.6"
EXEC #329891744:c=0,e=8801,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=793884371225
ERROR #2:err=6502 tim=793884371253

2 окт 17, 23:20    [20837652]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2961
AmKad,

Какой-то прям client-side cursor sharing
3 окт 17, 00:42    [20837719]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2961
Похоже на новую фичу-хреничу More secure
3 окт 17, 00:53    [20837725]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
xtender
Member

Откуда: Мск
Сообщений: 4680
AmKad,

он ответил:
set secureliterals off
3 окт 17, 01:25    [20837745]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
ментяра
Guest
AmKad, коллега, если у вас на рабочем месте установлен Toad, зачем вам эта джавовая поделка?
3 окт 17, 10:37    [20838195]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
AmKad
Member

Откуда:
Сообщений: 4686
ментяра,

На текущей работе Toad-а нет. Приходится юзать альтернативы. Toad стоит только дома.
3 окт 17, 10:54    [20838263]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
ментяра
Guest
AmKad,

А пригласите меня на чашечку чая, просто на чеки оплаты лицензии посмотреть? По какому адресу выезжать?
3 окт 17, 11:47    [20838484]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
exp98
Member

Откуда:
Сообщений: 1167
SQL Developer 4.2.0.17.089
хрень та же
TO_NUMBER(SQLDEVBIND1Z_1)
чтобы выявить, просто добавил
PrintNum(p_num OUT number)

PrintNum(+36.6) - конечно работает.
3 окт 17, 13:13    [20838758]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
exp98
Member

Откуда:
Сообщений: 1167
Недавно сюда жаловался, судя по всему по той же причине: подразумевает текст.
Введя без кавычек :AA:
select to_date( :AA, 'dd.mm') from dual
всё ок. А Тоад просто позволяет явно указать тип при вводе.
3 окт 17, 14:17    [20839044]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
andzhi4
Member

Откуда:
Сообщений: 11
В sqlcl та же лажа. Ну то есть еще одно свидетельство, что это кусок кода девелопера без графической морды

+
$ sql andzhi4/password@localhost:1521/rabbix

SQLcl: Release 12.2.0.1.0 RC on Tue Oct 03 23:06:09 2017

Copyright (c) 1982, 2017, Oracle.  All rights reserved.

Last Successful login time: Tue Oct 03 2017 23:06:09 +03:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


NAME                 OPEN_MODE 
-------------------- ----------
RABBIX               READ WRITE


SQL> set serveroutput on;
SQL> alter session set nls_numeric_characters = ",.";

Session altered.

SQL> declare
  2      procedure PrintNum(p_num number) as
  3      begin
  4          dbms_output.put_line(p_num);
  5      end;
  6  begin
  7      PrintNum(36.6);
  8  end;
  9  /

Error starting at line : 1 in command -
declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.6);
end;
Error report -
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 7
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.
SQL> 
3 окт 17, 23:10    [20840500]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5598
AmKad
Oracle SQL Developer 17.3.0.271

Нумерация версий по номеру года всё-таки пугающая штука.

Фактически, перевирается сама концепция major.minor.[.build[.revision[.somebullshit]]]. Печальное зрелище.
4 окт 17, 09:27    [20840935]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
Раритетное мнение
Guest
env
Нумерация версий по номеру года всё-таки пугающая штука.
Маркетинг посчитал, что напоминание датой заставит тебя быстрее переходить на новое. Но может быть и обратная реакция. Если сейчас постыдно ездить на авто 99го года, то авто 49го года уже шик!
4 окт 17, 12:55    [20841800]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
AmKad
Member

Откуда:
Сообщений: 4686
Если функцию объявить в SQL, то отрабатывает (Oracle SQL Developer 17.2.0.188).
SQL> set echo on
SQL> set lines 80
SQL> 
SQL> declare
  2      procedure PrintNum(p_num number) as
  3      begin
  4          dbms_output.put_line(p_num);
  5      end;
  6  begin
  7      PrintNum(36.6);
  8  end;
  9  /

Error starting at line : 4 in command -
declare
    procedure PrintNum(p_num number) as
    begin
        dbms_output.put_line(p_num);
    end;
begin
    PrintNum(36.6);
end;
Error report -
ORA-06502: PL/SQL: : ошибка преобразования символа в число ошибка числа или значения
ORA-06512: на  line 7
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.
SQL> 
SQL> with 
  2  function GetNum(p_num number) return varchar2 as
  3  begin
  4      return to_char(p_num);
  5  end;
  6  select GetNum(36.6)
  7  from dual;
  8  /

GETNUM(36.6)                                                                    
--------------------------------------------------------------------------------
36,6
5 окт 17, 10:24    [20844396]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
китайский советчик
Guest
AmKad,

пишите об ошибке Jeff-у: https://www.thatjeffsmith.com/ask-a-question/

ПС. насчет отказа от версий в пользу нумерации по годам - кто-то возмущается. А зачем? Я тоже считаю, что лучше постояное улучшение без задрежек и без резких переходов с концепции на концепцию, чем ждать пока выйдет какая-то новая версия продукта и придется все менять. Также присутствует маркетинг - привязывают пользователя к своему продукту, не давая спрыгнуть на чужие. Примерно так же у JetBrains.
5 окт 17, 12:24    [20844966]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SQL Developer 17.3.0: Кривой биндинг переменных  [new]
exp98
Member

Откуда:
Сообщений: 1167
Заодно спрошу.
SQL Developer 4.2.0.17
Экспорт в эксэл результатов запроса. Столб с датами экспортируется как текст (с кавычкой впереди). В ранних версиях также было? сейчас так же? побороть настройками девелопера?
10 окт 17, 09:59    [20856682]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить