Bagaimana saya bisa mendapatkan definisi lengkap (sql) dari tampilan sistem seperti user_objects?

Saya ingin mendapatkan kode SQL lengkap dari tampilan sistem seperti USER_OBJECTS. Namun, ketika saya menjalankan kueri di bawah ini, ia mengembalikan kesalahan yang mengatakan tampilan tidak ditemukan dalam skema SYS.

select dbms_metadata.get_ddl('VIEW', 'USER_OBJECTS', 'SYS') from dual;

Saat saya menjalankan kueri di bawah ini, ia mengembalikan beberapa kode di kolom text_vc, tetapi tidak yang lengkap. Saya tidak dapat melihat tabel dan klausa Where, dll.

select * from ALL_VIEWS where VIEW_NAME  = 'USER_OBJECTS';

Tapi dengan query ini, saya bisa melihat bahwa itu ada dalam skema SYS dengan nama itu. Jadi, apa alasan saya tidak dapat melihat keseluruhan kueri? Dan apakah ada cara untuk melihat semuanya?


person oramas    schedule 18.05.2020    source sumber
comment
Apa versi Oracle Anda?   -  person wolφi    schedule 18.05.2020


Jawaban (2)


+1 untuk melihat definisi tampilan sistem!

Masalah pertama (DBMS_METADATA kosong) adalah masalah hak istimewa. Menurut dokumentasi, pengguna normal akan hanya melihat objeknya sendiri. Anda memerlukan peran SELECT_CATALOG_ROLE atau EXP_FULL_DATABASE untuk melihat objek pengguna lain.

Masalah kedua (SQL tidak lengkap) berasal dari tipe data PANJANG, yang - menurut Oracle - tidak boleh digunakan lagi. Namun, ini masih digunakan oleh Oracle untuk definisi tampilan, default, teks batasan, dll. Karena sangat sulit untuk ditangani, tampilan ALL_VIEWS memiliki teks asli di kolom LONG dan teks terpotong, sebagian besar 4000 karakter pertama, di kolom kolom text_vc, mungkin untuk "teks di varchar".

Sunting:

Saya yakin Anda menggunakan Oracle 12 saat Anda menyebutkan kolom text_vc, yang tidak tersedia di Oracle 11. Agaknya, Anda menggunakan database dalam container. Jika ya, silakan lihat Arsitektur Kamus Data dalam CDB. Rupanya, definisi Oracle menyediakan hal-hal seperti tampilan dan paket hanya terlihat di wadah root. Mendesah!!

person wolφi    schedule 18.05.2020

Di SQL*Plus, Anda akan set long (saya mempersingkat hasilnya):

SQL> set pagesize 0
SQL> set long 10000
SQL>
SQL> select text from all_views where view_name = 'USER_OBJECTS';
select o.name, o.subname, o.obj#, o.dataobj#,
       decode(o.type#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
                      4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                      7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                      11, 'PACKAGE BODY', 12, 'TRIGGER',
<snip>
from sys."_CURRENT_EDITION_OBJ" o
where o.owner# = userenv('SCHEMAID')
  and o.linkname is null
  and (o.type# not in (1  /* INDEX - handled below */,
                      10 /* NON-EXISTENT */)
       or
<snip>
union all
select l.name, NULL, to_number(null), to_number(null),
       'DATABASE LINK',
       l.ctime, to_date(null), NULL, 'VALID', 'N', 'N', 'N', NULL, NULL
from sys.link$ l
where l.owner# = userenv('SCHEMAID')


SQL>

Selain itu, kueri pertama Anda berfungsi di database saya (11g XE) jika saya terhubung sebagai SYS:

SQL> show user
USER is "SYS"
SQL> select dbms_metadata.get_ddl('VIEW', 'USER_OBJECTS', 'SYS') from dual;

DBMS_METADATA.GET_DDL('VIEW','USER_OBJECTS','SYS')
--------------------------------------------------------------------------------

  CREATE OR REPLACE FORCE VIEW "SYS"."USER_OBJECTS" ("OBJECT_NAME", "SUBOBJECT_N
AME", "OBJECT_ID", "DATA_OBJECT_ID", "OBJECT_TYPE", "CREATED", "LAST_DDL_TIME",
"TIMESTAMP", "STATUS", "TEMPORARY", "GENERATED", "SECONDARY", "NAMESPACE", "EDIT
ION_NAME") AS
  select o.name, o.subname, o.obj#, o.dataobj#,
       decode(o.type#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
                      4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                      7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                      11, 'PACKAGE BODY', 12, 'TRIGGER',
<snip>
person Littlefoot    schedule 18.05.2020
comment
get_ddl berfungsi di 11, tetapi tidak di 12.2, tahukah Anda alasannya? - person wolφi; 18.05.2020
comment
Saya tidak punya versi 12.2 untuk dicoba, @wolφi. Saya memiliki akses ke 12.2.0.1.0 dan berfungsi di sana. - person Littlefoot; 18.05.2020
comment
saya juga di 12.2.0.1.0. Doc ID 2479803.1 mengatakan saya telah memeriksa wadah yang salah. Setelah alter session set container=cdb$root; semuanya berfungsi. - person wolφi; 18.05.2020