2014-02-25 45 views
1

我正在運行Oracle SQL Developer 4.0。當我編寫一個表格時,所有者,表格名稱,列名稱,約束名稱等都用雙引號括起來。我查看了「工具」 - >「首選項」,但無法找到任何關閉它的選項。有沒有人知道如何編寫一個沒有這些引號的表格?Oracle SQL Developer 4.0 - 如何刪除腳本中的雙引號

謝謝

+0

他們是一個問題嗎?就我個人而言,我覺得它們很醜陋,只要你沒有混合大小寫標識符或其他任何需要引用的東西,但是它們在腳本中受到傷害,就不需要它們了?你還可以澄清你是如何產生這個的 - 從查看錶的'SQL'選項卡或通過你自己的'dbms_metadata'命令? –

+0

當我點擊表格時,選擇SQL選項卡,這裏顯示的腳本包含雙引號。或者當我右鍵單擊表格並選擇Quick DDL時,引號也包含在這裏。 – sydney

+1

我通常會做的首先檢查是否沒有任何有問題的標識符(例如'「UglyCamelCase」'),如果沒有任何標識符,我會執行搜索和替換來刪除'''',然後突出顯示代碼並反覆按Ctrl +'將案例更改爲所需的標準,然後保存該腳本並將其簽入源代碼管理,以便我再也不必這樣做:) –

回答

1

我不認爲你可以使用這些方法。他們都使用引擎蓋下的dbms_metata.get_ddl,它似乎和doesn't have an option to not quote identifiers。看起來像導出也使用該包裝;數據建模器可以選擇引用標識符,但不確定這對您有用。

只要DDL小於32K,您可以通過從工作表中查詢來擺脫它們。在默認設置:

create table t42 (id number, str varchar2(10) default 'ABC', 
    constraint t42_pk primary key (id)); 
create index i42 on t42(str); 

set long 1000 
select dbms_metadata.get_ddl('TABLE', 'T42', user) from dual; 
select dbms_metadata.get_dependent_ddl('INDEX', 'T42', user) from dual; 

    CREATE TABLE "STACKOVERFLOW"."T42" 
    ( "ID" NUMBER, 
    "STR" VARCHAR2(10) DEFAULT 'ABC', 
    CONSTRAINT "T42_PK" PRIMARY KEY ("ID") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
    TABLESPACE "USERS" ENABLE 
    ) SEGMENT CREATION DEFERRED 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING 
    TABLESPACE "USERS" 

    CREATE UNIQUE INDEX "STACKOVERFLOW"."T42_PK" ON "STACKOVERFLOW"."T42" ("ID") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 
    TABLESPACE "USERS" 
    CREATE INDEX "STACKOVERFLOW"."I42" ON "STACKOVERFLOW"."T42" ("STR") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    TABLESPACE "USERS" 

隨着一點點的操作:

begin 
    dbms_metadata.set_transform_param(dbms_metadata.SESSION_TRANSFORM, 
    'PRETTY', false); 
    dbms_metadata.set_transform_param(dbms_metadata.SESSION_TRANSFORM, 
    'SQLTERMINATOR', true); 
    dbms_metadata.set_transform_param(dbms_metadata.SESSION_TRANSFORM, 
    'CONSTRAINTS_AS_ALTER', true); 
    dbms_metadata.set_transform_param(dbms_metadata.SESSION_TRANSFORM, 
    'SEGMENT_ATTRIBUTES', false); 
end; 
/

select replace(dbms_metadata.get_ddl('TABLE', 'T42', user), '"', null) 
from dual; 
select replace(dbms_metadata.get_dependent_ddl('INDEX', 'T42', user), '"', null) 
from dual; 

    CREATE TABLE STACKOVERFLOW.T42 (ID NUMBER, STR VARCHAR2(10) DEFAULT 'ABC') ; 
    ALTER TABLE STACKOVERFLOW.T42 ADD CONSTRAINT T42_PK PRIMARY KEY (ID) ENABLE; 

    CREATE UNIQUE INDEX STACKOVERFLOW.T42_PK ON STACKOVERFLOW.T42 (ID) ; 
    CREATE INDEX STACKOVERFLOW.I42 ON STACKOVERFLOW.T42 (STR) ; 
+0

Alex,感謝您的代碼片段。 get_dll()只提供表結構,並且不包括索引,約束,默認值等等。有沒有辦法得到表的完整腳本?謝謝! – sydney

+0

@sydney - 它應該包含約束和默認值。其他依賴對象,你需要使用其他'dbms_metadata'調用SQL Developer隱藏了複雜性,但是正在執行相同的步驟 –

+0

好的,我必須研究你提供的示例當我運行get_dll e對於表格,它不包括列約束, – sydney