Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Преобразование числа в json  [new]
Vint
Member

Откуда: Москва
Сообщений: 4554
Oracle 12.2
Преобразование числа в json
select json_object(key 'x1' value 0.0133, key 'x2' value 0.133) from dual t

Преобразуем как сегодня больше хочется, куда делся ведущий 0?
{"x1":.0133,"x2":0.133}

Понятно что можно to_char, но это же неправильно...
10 май 18, 15:27    [21400240]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17833
Сам себе злобный буратино - кто же тащит благоприобретенные багофичи в прод ранее чем через пару-тройку мажорных версий?
Оно же пока даже собственный синтаксис не выдерживают:

SQL> select banner from v$version;

BANNER
----------
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

SQL> select json_object(  'x1' is 0.0133 ) jo from dual t ;

JO
--
{"x1":.0133}

SQL> select json_object(  'x1' value '0.0133' format JSON ) jo from dual t ;

JO
--
{"x1" : 0.0133}


SQL> select json_object(  'x1' value 0.0133 format JSON ) jo from dual t ;

ORA-00932: inconsistent datatypes: expected CHAR got NUMBER 
11 май 18, 16:02    [21403540]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Fogel
Member

Откуда:
Сообщений: 373
далеки вы от народа, поэтому и комментариев нет...
12 май 18, 00:19    [21404410]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
Да, почему-то возвращает в LAX формате. Я вписал FORMAT JSON STRICT, но ничего не поменялось. Написал чуваку из оракла, который этим занимается. Будем ждать.
13 май 18, 11:36    [21406148]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
Vint, есть таблетка: Patch 27486853: MERGE REQUEST ON TOP OF 12.2.0.1.0 FOR BUGS 27450783 27459909
13 май 18, 12:35    [21406192]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Vint
Member

Откуда: Москва
Сообщений: 4554
Shtock,
Спасибо, поставили - работает. Только таблетка для Линуха. для Винды нету и не предвидиться :)
15 май 18, 18:59    [21411532]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
Используй силу убеждения, Люк!
16 май 18, 19:26    [21414749]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
andrey_anonymous
SQL> select json_object(  'x1' value 0.0133 format JSON ) jo from dual t ;

ORA-00932: inconsistent datatypes: expected CHAR got NUMBER 
не понимаю, зачем тут "format JSON" ?
17 май 18, 18:20    [21418217]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17833
--Eugene--
зачем тут "format JSON" ?


Чтим доку:
автор
FORMAT JSON
This clause is optional and is provided for semantic clarity.
17 май 18, 18:41    [21418269]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
andrey_anonymous
for semantic clarity
боюсь, увидев ваш "format JSON", он полагает, что тем самым ему как бы намекают, что подсунутое значение будет JSON-строкой. а вы ему пытаетесь присунуть числовой литерал. вот он и в недоумении
17 май 18, 19:15    [21418367]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17833
--Eugene--
боюсь

Не бойтесь.
Читайте документацию.
17 май 18, 21:32    [21418660]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Vint
Member

Откуда: Москва
Сообщений: 4554
а теперь немного про преобразования timestamp в json. Все помнят что у systimestamp другой тип данных?
with c as
 (select  systimestamp ct_change  from dual 
 --union all select to_timestamp('10-Sep-02 14:10:10.123000', 'DD-Mon-RR HH24:MI:SS.FF') from dual
 )
select 
       json_object(key 'ct_change' value c.ct_change)
  from c 

так получаем 40654, а убрав комментарий - работаем)
база все та же:
+
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
"CORE	12.2.0.1.0	Production"
TNS for 64-bit Windows: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production
24 июл 18, 14:47    [21598259]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Vint
Member

Откуда: Москва
Сообщений: 4554
Всё там же всё те же:
with c as
 (select to_number('-0.' || lpad('9', 39, '9'), '9D' || lpad('9', 39, '9')) cn_value from dual)
select cn_value, json_object(key 'ct_change' value cn_value) from c

-1 ,{"ct_change":-99.9999999999999999999999999999999999999} результат воспроизводится только на точности в 38 символов после запятой и только при отрицательных значениях.
25 июл 18, 13:48    [21601149]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
-2-
Member

Откуда:
Сообщений: 15279
Vint
результат воспроизводится только на точности в 38 символов
Это уже особенности промежуточной точности вычислений.

К сообщению приложен файл. Размер - 10Kb
25 июл 18, 15:01    [21601417]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Vint
Member

Откуда: Москва
Сообщений: 4554
-2-,
ты немного не понял -99.9999999999999999999999999999999999999
25 июл 18, 17:52    [21602224]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Vint
Member

Откуда: Москва
Сообщений: 4554
Сегодня налетел на:
Row returned by JSON_OBJECTAGG ... RETURNING CLOB includes garbage character (Doc ID 2308008.1)
RETURNING clob нормально реализовать не смогли. даже с последними патчами второй раз воспроизводиться. а первый раз в сессии выполняется нормально.
10 авг 18, 16:28    [21638158]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Vint
Member

Откуда: Москва
Сообщений: 4554
сам бы так никогда не написал, но принесли на хвосте:
with
  w_data as
  (
    select --+materialize
           *
      from (select 1 as f, sysdate as d1, sysdate + 100 as d2 from dual)
  ),
  w_tree as
  (
    select 1 as f, to_number(null) as pf, 1    as cf from dual union all
    select 2 as f, to_number(1)    as pf, null as cf from dual union all
    select 3 as f, to_number(1)    as pf, null as cf from dual union all
    select 4 as f, to_number(1)    as pf, null as cf from dual union all
    select 5 as f, to_number(null) as pf, 1    as cf from dual union all
    select 6 as f, to_number(5)    as pf, null as cf from dual union all
    select 7 as f, to_number(5)    as pf, null as cf from dual union all
    select 8 as f, to_number(7)    as pf, null as cf from dual
  )
select 1
  from w_tree t
       left join w_data d
              on connect_by_root(cf) = d.f
start with t.cf =1
connect by prior t.f = t.pf

в общем то естественная ora-600 на 12.2 :)
10 авг 18, 16:51    [21638177]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
на 18 аналогично. но ничего, года через 3 заработает :)
13 авг 18, 11:05    [21640050]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Vint
Member

Откуда: Москва
Сообщений: 4554
Shtock,
3 года с выхода 12.2 вроде прошло))) у меня вообще сложилось впечатление что json они писали на коленке, причем это делал отдельный человек который никогда не видел oracle, при этом ему дали спецификацию на json_table не дав посмотреть на реализацию xml_table.
13 авг 18, 13:50    [21640396]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
-2-
Member

Откуда:
Сообщений: 15279
Очередное беспощадное улучшение json
2507724.1
This behavior is expected. SELECT FOR UPDATE on a table with JSON data is disallowed. This restriction began being enforced in 19.1 and the patch was backported for earlier versions where it first appears in the 12.2.0.1.190115DBJAN2019RU.
В 18.4 работает, в 19.3 дает ошибку:
create table notajson(n number);

select t.n, (select count(*) from json_table('[]', '$[*]' columns (x varchar2(10 char))) jt) const_expr
from notajson t
for update of t.n;

ORA-01786: FOR UPDATE of this query expression is not allowed
1 июл 19, 23:37    [21918608]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Pastic
Member

Откуда: Москва
Сообщений: 1748
Прочитал документацию.

Пробовал следующие варианты:
select json_objectagg(key dummy value rn) x
from
  (select rownum rn, dummy from dual
   connect by level<11)


select json_objectagg(key dummy value rn format json) x
from
  (select rownum rn, dummy from dual
   connect by level<11)


select json_object(key dummy value rn format json) x
from
  (select rownum rn, dummy from dual
   connect by level<11)


select json_object(key dummy value rn) x
from
  (select rownum rn, dummy from dual
   connect by level<11)


Все эти варианты возвращают ошибку ORA-00907: missing right parenthesis

Ещё я пробовал вариант отсюда:
SELECT JSON_OBJECTAGG( id VALUE text )
FROM   XMLTABLE(
         '/xml/*'
         PASSING XMLTYPE( '<xml><name>himanshu</name></xml>')
         COLUMNS id   VARCHAR2(200) PATH './name()',
                 text VARCHAR2(200) PATH './text()'
       );


Он тоже возвращает ORA-00907: missing right parenthesis.

И даже запрос из первого сообщения этой темы
select json_object(key 'x1' value 0.0133, key 'x2' value 0.133) from dual
тоже возвращает эту ошбку. Это из-за того, что я это делаю на Oracle 12.1, а не на 12.2?

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64-bit Production
13 авг 19, 11:21    [21947835]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
-2-
Member

Откуда:
Сообщений: 15279
Pastic
Это из-за того, что я это делаю на Oracle 12.1, а не на 12.2?
Осознанно взять инструкцию от другой версии, получить неожиданный ожидаемый результат и взывать к форуму, чтобы кто-то сравнил за тебя документацию на разные версии? В недоумении...
13 авг 19, 11:58    [21947889]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
-2-
Member

Откуда:
Сообщений: 15279
Еще в копилку странностей json (19.5)
> select t1s.nextval, json_object(t.dummy) j from dual t;

   NEXTVAL J                             
---------- ------------------------------
       123 {"dummy":"X"}                 

> select 123, json_object(t.*) j from dual t;

       123 J                             
---------- ------------------------------
       123 {"DUMMY":"X"}                 

> select t1s.nextval, json_object(t.*) j from dual t;

ORA-02287: sequence number not allowed here
Также json_object(*) несовместим c использованием plsql-переменных где-либо в том же запросе с ошибкой ORA-00904: "X": invalid identifier.
21 янв 20, 11:30    [22063575]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
123йй
Member

Откуда:
Сообщений: 1586
[quot -2-#22063575]Еще в копилку странностей json (19.5)
> select t1s.nextval, json_object(t.dummy) j from dual t;

   NEXTVAL J                             
---------- ------------------------------
       123 {"dummy":"X"}                 

а что в таком варианте
select t1s.nextval, json_object(t."DUMMY") j from dual t;
21 янв 20, 12:28    [22063621]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
-2-
Member

Откуда:
Сообщений: 15279
123йй
а что в таком варианте
Различие в регистре sql-странно, но документировано.
select json_object(t.DummY) j from dual t;

J                             
------------------------------
{"DummY":"X"}
Естественно, sql-индусы plsql-индусам об этом не сообщили и при plsql-нормализации запроса идентификатор оказывается в верхнем регистре "DUMMY".

Вопрос был о более другой странности, что запрос с json_object во что-то преобразуется и сиквенс оказывается где-то в подзапросе.
21 янв 20, 12:52    [22063640]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Sah
Member

Откуда: Moscow
Сообщений: 221
Привет, а с этим что-нибудь можно поделать?
SELECT banner
  FROM v$version
 WHERE 1=1;

DROP TABLE LOB_AUTO CASCADE CONSTRAINTS;

CREATE TABLE LOB_AUTO
(
  ID       INTEGER                              NOT NULL,
  LB_NAME  VARCHAR2(255 BYTE)
);

SET DEFINE OFF;
INSERT INTO LOB_AUTO
   (ID, LB_NAME)
 VALUES
   (1, 'ОСАГО');
INSERT INTO LOB_AUTO
   (ID, LB_NAME)
 VALUES
   (2, 'КАСКО');
COMMIT;

column  lob_val format a20
column  lob_name format a10 
column  lob_name_qt format a10

WITH tc AS (
SELECT JSON_OBJECT (KEY 'lob_name' VALUE ld.LB_NAME format json) lob_val
     , JSON_OBJECT (KEY 'lob_name' VALUE '"'||ld.LB_NAME||'"' format json) lob_val_qt
  FROM lob_auto ld
 WHERE 1=1  
)
SELECT lob_val,
    TO_CHAR(json_value(lob_val,  '$.lob_name')) lob_name
    ,TO_CHAR(json_value(lob_val_qt,  '$.lob_name')) lob_name_qt
  FROM tc; 


Результат:
LOB_VAL              LOB_NAME   LOB_NAME_Q
-------------------- ---------- ----------
{"lob_name":ОСАГО}              ОСАГО
{"lob_name":КАСКО}              КАСКО

Т.е. при формировании поля lob_name не экранируются значения. Это понятно, т.к. используется format json. А если без него, то получаем ошибку: ORA-40474: недопустимая последовательность байтов UTF-8 в данных JSON

Настройки БД:
NLS_CHARACTERSET CL8MSWIN1251
NLS_NCHAR_CHARACTERSET AL16UTF16

На компе:
NLS_LANG: AMERICAN_AMERICA.WE8MSWIN1252. Упс, ???, я ожидал AMERICAN_AMERICA.CL8MSWIN1251, который стоит во втором Хоме.
28 янв 20, 12:41    [22067685]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
-2-
Member

Откуда:
Сообщений: 15279
Sah,

dump
28 янв 20, 13:12    [22067719]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
Sah
Member

Откуда: Moscow
Сообщений: 221
Всё чисто
LOB_VAL              LOB_NAME LOB_NAME_Q DMP
-------------------- -------- ---------- --------------------------------
{"lob_name":ОСАГО}            ОСАГО      Typ=1 Len=5: 206,209,192,195,206
{"lob_name":КАСКО}            КАСКО      Typ=1 Len=5: 202,192,209,202,206
28 янв 20, 14:37    [22067773]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
-2-
Member

Откуда:
Сообщений: 15279
Что-то недокрутили в json_типах с remote lob локатором.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.5.0.0.0

SQL> set serveroutput on
SQL> declare
  2    j json_element_t;
  3    c clob;
  4  begin
  5    select full_text into c from all_statements@remote where rownum=1 and length(full_text) > 0;
  6    dbms_output.put_line(substr('c='||c, 1,22));
  7    j := json_element_t.parse(c);
  8  end;
  9  /
c=SELECT COUNT(*) FROM
declare
*
ERROR at line 1:
ORA-02019: connection description for remote database not found
ORA-06512: at "SYS.JDOM_T", line 9
ORA-06512: at "SYS.JSON_ELEMENT_T", line 22
ORA-06512: at line 7
Вероятно, внутри оно под current_schema=sys пытается влезть в дблинк по приватному имени.
Если публичный, то работает. Если приватный и одноименный публичный:
ORA-00600: internal error code, arguments: [], [], [], [], [], [], [], [], [], [], [], []
22 мар 20, 23:33    [22104145]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование числа в json  [new]
-2-
Member

Откуда:
Сообщений: 15279
Копилка пополняется, 19.5
declare
  js varchar2(100 char) := '{"x":null}';
  j json_object_t;
  s varchar2(100 char);
  c clob;
begin
  select json_value(js, '$.x' returning varchar2(100 char)),
         json_value(js, '$.x' returning clob)
    into s, c
    from dual;
  dbms_output.put_line('___sql s=['||s||'] c=['||c||']');
  j := json_object_t(js);
  s := j.get_string('x'); c := j.get_clob('x');
  dbms_output.put_line('pl/sql s=['||s||'] c=['||c||']');  
end;
/

___sql s=[] c=[]
pl/sql s=[] c=[null]
27 мар 20, 11:34    [22106805]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Oracle Ответить