Tôi có thể neo kiểu dữ liệu của mình vào loại hệ thống không?


7

Các mã sau đây:

create or replace type sqlids_t is table of sys.v_$sql.sql_id%type;

...đưa cho tôi...

Error(2,31): PLS-00329: schema-level type has illegal reference to SYS.V_$SQL

Tôi nhận được cùng một lỗi tạo một %objecthoặc %rowloại.

Có cách nào tôi có thể sử dụng một loại sys trong định nghĩa loại của tôi không? Tôi biết tôi có thể sử dụng cơ bản VARCHAR2(13), nhưng tôi muốn tránh nó nếu có thể.

Câu trả lời:


7

Câu trả lời ngắn: Không, bạn không thể, và không phải vì đó là loại hệ thống. Bạn không thể neo một kiểu độc lập với bất kỳ kiểu dữ liệu cột nào của bảng.

% TYPE là cấu trúc PL / SQL. TẠO [HOẶC THAY THẾ] LOẠI là SQL. Bạn không thể sử dụng% TYPE trong SQL.

Nó phần nào có ý nghĩa rằng bạn không thể. Nếu bạn sử dụng MYTABLE.MYCOLUMN% TYPE trong PL / SQL, bạn đã neo loại PL / SQL đó vào bảng và nếu loại MYCOLUMN thay đổi PL / SQL có thể làm mất hiệu lực mã của bạn, sau đó biên dịch lại mã đó. Rõ ràng là Oracle sẽ phải làm gì nếu ví dụ của bạn hoạt động.

Hãy tưởng tượng điều gì sẽ xảy ra nếu bạn đang lưu trữ các đối tượng của SQLID_T trong một bảng và định nghĩa của SQL_ID trong V_ $ SQL đã thay đổi. Oracle sẽ cần phải thay đổi định nghĩa của các đối tượng được lưu trữ? Điều gì xảy ra nếu không thể (ví dụ: SQL_ID đã thay đổi từ VARCHAR2 thành SỐ)? Điều đó có nên ngăn định nghĩa của V_ $ SQL thay đổi không? Hoặc bảng nào đó đã sử dụng loại đó trở nên không hợp lệ theo một cách nào đó ... bạn không thể CHỌN từ nó nữa?

Oracle cố gắng ngăn điều này xảy ra ( từ Hướng dẫn dành cho nhà phát triển đối tượng của Oracle ):

SQL> CREATE OR REPLACE TYPE t1 FORCE AS OBJECT (c varchar(20));
  2  /
Type created.

SQL> CREATE TABLE tb1 (c1 t1);
Table created.

SQL> CREATE OR REPLACE TYPE t1 FORCE AS OBJECT (d number);
  2  /
CREATE OR REPLACE TYPE t1 FORCE AS OBJECT (d number);
*
ERROR at line 1:
ORA-22866: cannot replace a type with table dependents

Bởi vì Oracle không biết phải làm gì, họ yêu cầu chúng tôi tạo ra các loại có mục đích ít rõ ràng hơn.
Noctis Skytower
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.