2015-07-22 25 views
7

Tôi có bảng "EvMetadata" với cột "Siêu dữ liệu" có ràng buộc kiểm tra "IS JSON". Lưu ý rằng bảng và các cột của nó được tạo bằng DOUBLE QUOTES theo thiết kế.Vấn đề truy vấn JSON Oracle 12c với ký hiệu dấu chấm và dấu ngoặc kép

Làm theo SQL hoạt động ở nơi tôi không chỉ định bất kỳ công việc JSON nào được thực hiện bởi Oracle.

select 
    m."Metadata" 
from "EvMetadata" m 

Như bạn có thể thấy bên dưới, cột Siêu dữ liệu chỉ hiển thị nội dung của nó, đó là dữ liệu JSON.

Showing content of "Metadata" column which is JSON

Tuy nhiên, tôi nhận được lỗi nếu tôi đã phát hành một truy vấn json như sau.

select 
    m."Metadata"."FileName" 
from "EvMetadata" m 

Tôi vừa thêm "Tên tệp" bằng ký hiệu chấm. Như bạn có thể thấy ở trên, "Tên tệp" là trường json hợp lệ. Vậy tại sao lỗi?

Lỗi là

ORA-00.904: "M" "Metadata" "FileName": định danh hợp lệ 00904. 00000 - "% s: định danh hợp lệ".. * Nguyên nhân: * Hành động: Lỗi tại dòng : 2 Cột: 3

Đây có phải là lỗi với hỗ trợ truy vấn JSON của Oracle sử dụng ký hiệu dấu chấm trong một trường hợp cụ thể mà đối tượng cơ sở dữ liệu được khai báo với dấu ngoặc kép không? Lý do tôi nghi ngờ rằng có thể đúng là truy vấn tương đương sau đây, không sử dụng ký pháp chấm, hoạt động.

select 
    JSON_VALUE(m."Metadata", '$.FileName') 
from "EvMetadata" m 
+0

Tôi thực sự phải đối mặt với cùng một vấn đề và không tìm thấy bất kỳ câu trả lời có liên quan nào sau giờ tìm kiếm trên web. Hy vọng một tiền thưởng sẽ mang lại sự chú ý đầy đủ ở đó. – ffarquet

+0

Điều gì xảy ra nếu bạn chạy phép chiếu ký hiệu chấm mà không có dấu ngoặc kép? 'chọn m.Metadata.FileName từ" EvMetadata "m' Tôi chỉ thấy dấu chấm công việc mà không có dấu ngoặc kép xung quanh các trường và tôi tưởng tượng rằng các dấu ngoặc kép yêu cầu hỗn hợp là phức tạp thực hiện. – leroyJr

+0

Trong trường hợp của tôi, tôi đã thử cả hai với cùng một vấn đề. Tôi đoán Oracle đối xử với họ theo cùng một cách. Báo giá chỉ có để đảm bảo xử lý chính xác các ký tự đặc biệt. – ffarquet

Trả lời

-1

Bạn không cần dấu ngoặc kép, điều này sẽ làm việc:

select m.Metadata.FileName from EvMetadata m

Vui lòng tham khảo các ví dụ về chính thức documentation:

SELECT po.po_document.PONumber FROM j_purchaseorder po;

SELECT json_value(po_document, '$.PONumber') FROM j_purchaseorder;

+0

Oracle xử lý trích dẫn và bỏ phiếu chính xác cùng một cách khi nói về ký pháp JSON. Nhưng dấu ngoặc kép cho phép bạn có các ký tự đặc biệt trong tên khóa. – ffarquet

3

Bạn cần phải có một "LÀ JSON" ràng buộc kiểm tra trên cột cho ký hiệu dấu chấm để làm việc:

Dưới đây là một đoạn trích từ tài liệu:

Mỗi json_key phải là một định danh SQL hợp lệ và cột phải có ràng buộc kiểm tra json, đảm bảo rằng nó chứa dữ liệu JSON được định dạng tốt. Nếu một trong các quy tắc này không được tôn trọng thì lỗi sẽ được tăng lên tại thời gian biên dịch truy vấn. (Ràng buộc kiểm tra phải có mặt để tránh gây ra lỗi, tuy nhiên, nó không cần phải hoạt động. Nếu bạn hủy kích hoạt ràng buộc thì lỗi này không được nâng lên.)

Đây là ví dụ kiểm tra tôi đã xác minh đây là cách hoạt động:

--create a table to put stuff in 
create table foo (
json varchar2(4000) 
); 
-------------------------------- 
Table FOO created. 

--insert test value 
insert into foo(json) values('{"attr1":5,"attr2":"yes"}'); 
commit; 
-------------------------------- 
1 row inserted. 
Commit complete. 


--try some selects 
--no table alias, no constraint, borked 
select json.attr1 from foo; 
-------------------------------- 
Error starting at line : 12 in command - 
select json.attr1 from foo 
Error at Command Line : 12 Column : 8 
Error report - 
SQL Error: ORA-00904: "JSON"."ATTR1": invalid identifier 
00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 


--with table alias, no constraint, borked 
select a.json.attr1 from foo a; 
-------------------------------- 
Error starting at line : 15 in command - 
select a.json.attr1 from foo a 
Error at Command Line : 15 Column : 8 
Error report - 
SQL Error: ORA-00904: "A"."JSON"."ATTR1": invalid identifier 
00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 


--add our constraint 
alter table foo add constraint json_isjson check (json is json); 
-------------------------------- 
Table FOO altered. 

--no table alias, with constraint, borked 
select json.attr1 from foo; 
-------------------------------- 
Error starting at line : 21 in command - 
select json.attr1 from foo 
Error at Command Line : 21 Column : 8 
Error report - 
SQL Error: ORA-00904: "JSON"."ATTR1": invalid identifier 
00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 


--table alias and constraint, works! 
select a.json.attr1 from foo a; 
-------------------------------- 
ATTR1                   
-------------------------------------------------------------------------------- 
5                    
2

Trong trường hợp bất kỳ ai khác gặp phải vấn đề này, tài liệu được nêu trong Hỗ trợ của Oracle theo ghi chú 2192052.1

Về cơ bản, đó là một lỗi trong đó Dot Notation không hoạt động trên một cột được tạo ra với một hạn chế NOT NULL, tức là

Nếu bạn làm:

CREATE TABLE foo.bar (id NUMBER NOT NULL, json_doc CLOB NOT NULL CHECK (json_doc IS JSON)); 

bạn sẽ nhận được lỗi khi bạn chạy:

SELECT a.json_doc.elementName FROM foo.bar a; 

nhưng nếu bạn làm:

CREATE TABLE foo.bar (id NUMBER NOT NULL, json_doc CLOB CHECK (json_doc IS JSON)); 
ALTER TABLE bar MODIFY (json_doc NOT NULL); 

Ký hiệu dấu chấm sẽ hoạt động.

Các vấn đề liên quan