在工作中我們會遇到從數據庫中獲取某些對象的定義腳本,比如:
PROCEDURE
PACKAGE
PACKAGE BODY
TRIGGER
FUNCTION
TABLE等。
這裏就教大家一招獲取指定對象的定義語句的方法。
獲取HR用戶下employees表的結構:
1.查看employees表中有哪些字段:
SQL>desc employees; 名稱 是否爲空? 類型 ------------------------------------------------- ---------------------------- EMPLOYEE_ID NOT NULL NUMBER(6) FIRST_NAME VARCHAR2(20) LAST_NAME NOT NULL VARCHAR2(25) EMAIL NOT NULL VARCHAR2(25) PHONE_NUMBER VARCHAR2(20) HIRE_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2(10) SALARY NUMBER(8,2) COMMISSION_PCT NUMBER(2,2) MANAGER_ID NUMBER(6) DEPARTMENT_ID NUMBER(4)
嘗試獲取建表語句:
執行效果如下:
SQL> selectDBMS_METADATA.get_ddl('TABLE','EMPLOYEES','HR') from dual; DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','HR') -------------------------------------------------------------------------------- CREATE TABLE "HR"."EMPLOYEES" ( "EMPLOYEE_ID"NUMBER(6,0), "FIRST_NAME" SQL>
發現顯示的不完整,看看配置參數;
SQL> show long long 80 SQL> set long 9999
重新執行語句
SQL>select DBMS_METADATA.get_ddl('TABLE','EMPLOYEES','HR') from dual; DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','HR') -------------------------------------------------------------------------------- CREATE TABLE"HR"."EMPLOYEES" ( "EMPLOYEE_ID" NUMBER(6,0), "FIRST_NAME" VARCHAR2(20), "LAST_NAME" VARCHAR2(25)CONSTRAINT "EMP_LA ST_NAME_NN"NOT NULL ENABLE, "EMAIL" VARCHAR2(25)CONSTRAINT "EMP_EMAIL_NN" NO T NULLENABLE, "PHONE_NUMBER" VARCHAR2(20), "HIRE_DATE" DATE CONSTRAINT"EMP_HIRE_DATE_NN" NOT N ULL ENABLE, DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','HR') -------------------------------------------------------------------------------- "JOB_ID" VARCHAR2(10)CONSTRAINT "EMP_JOB_NN" NOT NULLENABLE, "SALARY" NUMBER(8,2), "COMMISSION_PCT" NUMBER(2,2), "MANAGER_ID" NUMBER(6,0), "DEPARTMENT_ID" NUMBER(4,0), CONSTRAINT "EMP_SALARY_MIN"CHECK (salary > 0 ) ENABLE, CONSTRAINT "EMP_EMAIL_UK"UNIQUE ("EMAIL") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','HR') -------------------------------------------------------------------------------- STORAGE(INITIAL 65536 NEXT 1048576 MINEXTEN TS 1MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1BUFFER_ POOLDEFAULT FLASH_CACHE DEFAULT CELL_FL ASH_CACHEDEFAULT) TABLESPACE "EXAMPLE" ENABLE, CONSTRAINT "EMP_EMP_ID_PK"PRIMARY KEY ("EMPLO YEE_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255NO LOGGINGCOMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS1 MA DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','HR') -------------------------------------------------------------------------------- XEXTENTS2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GRO UPS 1BUFFER_POOL DEFAULT FLASH_CACHE DE FAULTCELL_FLASH_CACHE DEFAULT) TABLESPACE "EXAMPLE" ENABLE, CONSTRAINT "EMP_MANAGER_FK"FOREIGN KEY ("MANAGER_ID" ) REFERENCES"HR"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE, CONSTRAINT "EMP_JOB_FK"FOREIGN KEY ("JO B_ID") REFERENCES"HR"."JOBS" ("JOB_ID") ENABLE, DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','HR') -------------------------------------------------------------------------------- CONSTRAINT "EMP_DEPT_FK"FOREIGN KEY ("DEPART MENT_ID") REFERENCES"HR"."DEPARTMENTS" ("DEPARTMENT_ID") ENABLE ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255NOCOMPRESS NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS1 MAXEXTENTS2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1BUFFER_POOL DEFAULTFLASH_CACHE DEFAULT CELL_FLASH_C DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','HR') -------------------------------------------------------------------------------- ACHEDEFAULT) TABLESPACE "EXAMPLE" SQL>
結果就是我們獲取的hr.employees的建表語句了。
除了表,dbms_metadate.get_ddl還可以獲取到觸發器,存儲過程等的信息。
諸如:
select dbms_metadata.get_ddl ('TRIGGER','ACCOUNT','TEST')from dual;
此語句的格式爲
select dbms_metadata.get_ddl (‘object_type’,’object_name’,’username’)from dual ;