2014-02-25 70 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