1. 程式人生 > >檢視oracle的DDL語句

檢視oracle的DDL語句



使用dbms_metadata.get_ddl遇到ORA-31603

建了一個外部表,想看看這個表的資訊,一查就報錯了:

SQL> select dbms_metadata.get_ddl('TABLE','ext_case1') from dual;

ERROR:

ORA-31603: object "ext_case1" of type TABLE not found in schema "SCOTT"

ORA-06512: at "SYS.DBMS_METADATA", line 1546

ORA-06512: at "SYS.DBMS_METADATA", line 1583

ORA-06512: at "SYS.DBMS_METADATA", line 1901

ORA-06512: at "SYS.DBMS_METADATA", line 2792

ORA-06512: at "SYS.DBMS_METADATA", line 4333

ORA-06512: at line 1

no rows selected

看看錶時候存在,表確實是存在的:

SQL> select * from ext_case1;

ENAME   JOB                                 SAL

----------     --------------------         ----------

SMITH     CLEAK                            3904

ALLEN    SALESMAN                     2891

WARD    SALESMAN                      3128

KING      PRESIDENT                     2523

SQL> 

鬱悶了,換sysdba使用者試了一下,錯誤依然,有檢查了一遍,還是不知道錯誤在那裡,不想弄了,也不想看書了,下去買了瓶水,回來又試了一把,還是錯誤。

不解決不死心,google一把,悲劇了,google又間歇性的癱瘓了,無奈baidu,找到一個答案說是使用者沒有查詢許可權。

給scott賦許可權:

SQL> grant select_catalog_role to scott;

Grant succeeded.

SQL> 

再查詢還是不行,唉。。。開啟google,google正常工作了。又找到一個答案,說是get_ddl裡的引數都要大寫。

SQL> select dbms_metadata.get_ddl('TABLE','EXT_CASE1') from dual;

DBMS_METADATA.GET_DDL('TABLE','EXT_CASE1')

--------------------------------------------------------------------------------

  CREATE TABLE "SCOTT"."EXT_CASE1"

   ("ENAME" VARCHAR2(10),

"JOB" VARCHAR2

SQL> 

輸出的資訊好像沒有顯示全,要設定一下sqlplus的long的設定來改變顯示的長度,預設的long是80

SQL> set long 2000

SQL> select dbms_metadata.get_ddl('TABLE','EXT_CASE1') from dual;

DBMS_METADATA.GET_DDL('TABLE','EXT_CASE1')

--------------------------------------------------------------------------------

  CREATE TABLE "SCOTT"."EXT_CASE1"

   ("ENAME" VARCHAR2(10),

"JOB" VARCHAR2(20),

"SAL" NUMBER

   )

   ORGANIZATION EXTERNAL

    ( TYPE ORACLE_LOADER

      DEFAULT DIRECTORY "EXTDIR"

      ACCESS PARAMETERS

      ( records delimited by newline

DBMS_METADATA.GET_DDL('TABLE','EXT_CASE1')

--------------------------------------------------------------------------------

skip 6

fields terminated by ","

(ename,job,sal)

    )

      LOCATION

       ( 'ldr_case1.ctl'

       )

    )

SQL> 

另外DBMS_METADATA.GET_DDL預設的是檢視當前使用者的資訊,如果你以使用者A來檢視使用者B的表要在dbms_metadata.get_ddl的第三個引數里加上表/表空間的schmea,否則就會報ORA-31603。

以sysdba檢視scott的表(不加schmea):

SQL> show user 

USER is "SYS"

SQL> select dbms_metadata.get_ddl('TABLE','BONUS') from dual;

ERROR:

ORA-31603: object "BONUS" of type TABLE not found in schema "SYS"

ORA-06512: at "SYS.DBMS_METADATA", line 1546

ORA-06512: at "SYS.DBMS_METADATA", line 1583

ORA-06512: at "SYS.DBMS_METADATA", line 1901

ORA-06512: at "SYS.DBMS_METADATA", line 2792

ORA-06512: at "SYS.DBMS_METADATA", line 4333

ORA-06512: at line 1

no rows selected

SQL> 

sysdba檢視scott的表(加schmea):

SQL> show user

USER is "SYS"

SQL> select dbms_metadata.get_ddl('TABLE','BONUS','SCOTT') from dual;

DBMS_METADATA.GET_DDL('TABLE','BONUS','SCOTT')

--------------------------------------------------------------------------------

  CREATE TABLE "SCOTT"."BONUS"

   ("ENAME" VARCHAR2(10),

"JOB" VARCHAR2(9),

"SAL" NUMBER,

"COMM" NUMBER

   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

  TABLESPACE "USERS"

DBMS_METADATA.GET_DDL('TABLE','BONUS','SCOTT')

--------------------------------------------------------------------------------

SQL> 

總結:

1)dbms_metadata.get_ddl()包()內的引數都要大寫。
2)是否查的當前使用者的DDL,不是要加上物件的schmea。
3)如果資訊顯示不全,set long 9999(隨便設定他的大小,就是為了完全顯示查詢的結果)。