Số nhận dạng ORA-00972 là tên cột bí danh quá dài


81

tôi có một truy vấn như:

SELECT column as averyveryveryverylongalias (more than 30 characters)
   FROM Table_name

nó trả về lỗi số nhận dạng ORA-00972 quá dài , có mẹo nào để làm cho nó hoạt động mà không làm cho bí danh ngắn hơn không?

Cảm ơn

Câu trả lời:


104

Không, trước phiên bản 12.2 của Oracle, số nhận dạng không được phép vượt quá 30 ký tự. Xem Tham chiếu Ngôn ngữ SQL Oracle .

Tuy nhiên, từ phiên bản 12.2, chúng có thể dài tới 128 byte. (Lưu ý: byte, không phải ký tự).


23
vì tò mò, có ai biết giới hạn này đến từ đâu, và tại sao giới hạn này chưa bao giờ được nới lỏng? Nó thực sự tấn công tôi rằng không ai trong số các triệu đô la trả tiền khách hàng của Oracle bao giờ yêu cầu như một tính năng (bây giờ không làm cho tôi sai, tôi khá chắc chắn rằng có một số lý do kỹ thuật sâu, nhưng vẫn ..)
phtrivier

10
Được rồi, tôi có thể hỏi SO: stackoverflow.com/questions/1378133/...
phtrivier

Tôi cũng gặp trường hợp này. Tôi có một cột bảng với độ dài tên = 32. Nhưng tại sao trên trái đất, một tên cột bảng được phép dài hơn 30 ký tự, trong khi đồng thời một số nhận dạng thì không? Những giới hạn này nên đi đôi với nhau, phải không? Làm thế nào có thể phát sinh tình huống này?
Vering

@Vering Nó có hơn 30 ký tự hay hơn 30 byte? Có một lỗi kỳ lạ trong đó số nhận dạng có thể dài hơn 30 byte một chút nếu ký tự cuối cùng là nhiều byte.
Jon Heller

@JonHeller: Tôi khá chắc chắn đó là
30/32

12

Lỗi cũng do việc xử lý các dấu ngoặc kép và các qutoes đơn lẻ. Để đưa dấu nháy đơn bên trong truy vấn, sử dụng tăng gấp đôi dấu nháy đơn.

Điều này sẽ không hoạt động

select dbms_xmlgen.getxml("Select ....") XML from dual;

hoặc cái này

select dbms_xmlgen.getxml('Select .. where something='red'..') XML from dual;

nhưng điều này KHÔNG hoạt động

select dbms_xmlgen.getxml('Select .. where something=''red''..') XML from dual;

Đánh dấu thay đổi ví dụ của tôi nó phải được một cái gì đó tương đương với trích dẫn đơn giá duy nhất màu đỏ nháy đơn trích dẫn đơn
cummings mike

5

Đối tượng nơi Oracle lưu trữ tên của số nhận dạng (ví dụ: tên bảng của người dùng được lưu trong bảng có tên USER_TABLES và tên cột của người dùng được lưu trong bảng có tên là USER_TAB_COLUMNS), có các cột TÊN (ví dụ: TABLE_NAME trong USER_TABLES) có kích thước Varchar2 (30) ... và nó đồng nhất thông qua tất cả các bảng hệ thống của các đối tượng hoặc số nhận dạng -

 DBA_ALL_TABLES         ALL_ALL_TABLES        USER_ALL_TABLES
 DBA_PARTIAL_DROP_TABS  ALL_PARTIAL_DROP_TABS USER_PARTIAL_DROP_TABS
 DBA_PART_TABLES        ALL_PART_TABLES       USER_PART_TABLES 
 DBA_TABLES             ALL_TABLES            USER_TABLES           
 DBA_TABLESPACES        USER_TABLESPACES      TAB
 DBA_TAB_COLUMNS      ALL_TAB_COLUMNS         USER_TAB_COLUMNS 
 DBA_TAB_COLS         ALL_TAB_COLS            USER_TAB_COLS 
 DBA_TAB_COMMENTS     ALL_TAB_COMMENTS        USER_TAB_COMMENTS 
 DBA_TAB_HISTOGRAMS   ALL_TAB_HISTOGRAMS      USER_TAB_HISTOGRAMS 
 DBA_TAB_MODIFICATIONS  ALL_TAB_MODIFICATIONS USER_TAB_MODIFICATIONS 
 DBA_TAB_PARTITIONS   ALL_TAB_PARTITIONS      USER_TAB_PARTITIONS

5

Tôi đang sử dụng hệ thống báo cáo Argos làm giao diện người dùng và Oracle ở phía sau. Tôi vừa gặp phải lỗi này và nó được gây ra bởi một chuỗi có dấu nháy kép ở đầu và dấu nháy đơn ở cuối. Thay thế dấu ngoặc kép bằng một dấu ngoặc kép đã giải quyết được vấn đề.


0

Nếu gần đây bạn đã nâng cấp springboot lên 1.4.3, bạn có thể cần thực hiện các thay đổi đối với tệp yml:

yml trong 1,3:

jpa: 
  hibernate: 
    namingStrategy: org.hibernate.cfg.EJB3NamingStrategy

yml trong 1.4.3:

jpa: 
  hibernate: 
    naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

-2

Như những người khác đã đề cập, tên trong Oracle SQL phải ít hơn hoặc bằng 30 ký tự. Tôi muốn nói thêm rằng quy tắc này không chỉ áp dụng cho tên bảng mà còn cho cả tên trường. Vì vậy, bạn có nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.