【问题标题】:Oracle SQL Developer 4.0 - How to remove double quotes in scriptsOracle SQL Developer 4.0 - 如何删除脚本中的双引号
【发布时间】:2014-02-26 01:39:26
【问题描述】:

我正在运行 Oracle SQL Developer 4.0。当我编写一个表时,所有者、表名、列名、约束名等都用双引号括起来。我查看了 Tools -> Preferences 并找不到任何关闭它的选项。有谁知道如何编写没有这些引号的表格?

谢谢

【问题讨论】:

  • 他们有问题吗?就我个人而言,我觉得它们很丑,只要你没有混合大小写的标识符或其他任何需要引用的东西,它们就不需要它们,但是它们在脚本中会受到伤害吗?您能否说明一下您是如何生成这个的——在查看表时从“SQL”选项卡,还是通过您自己的dbms_metadata 命令?
  • 当我点击表格时,选择SQL选项卡,这里显示的脚本包含双引号。或者当我右键单击表格并选择 Quick DDL 时,引号也包含在此处。
  • 我通常做的是首先检查没有任何有问题的标识符(例如"UglyCamelCase"),如果没有,我会进行搜索和替换以删除@ 987654323@s,然后突出显示代码并反复按 Ctrl+' 将大小写更改为所需的标准。然后我保存脚本并将其签入源代码管理,这样我就不必再这样做了:)

标签: oracle oracle-sqldeveloper


【解决方案1】:

我认为你不能使用这些方法来做到这一点。他们都在后台使用dbms_metata.get_ddl,看起来,还有doesn't have an option to not quote identifiers。看起来 export 也使用了那个包;数据建模者可以选择引用标识符,但不确定这对您是否有用。

不过,只要 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) ;

【讨论】:

  • 亚历克斯,感谢您的 sn-p。看来 get_dll() 只提供表结构并排除索引、约束、默认值等内容。有没有办法获取表的完整脚本?谢谢!
  • @sydney - 它应该已经包含约束和默认值。对于索引和其他依赖对象,您需要使用其他 dbms_metadata 调用。 SQL Developer 为您隐藏了复杂性,但正在执行相同的步骤。
  • 好的,我必须探索您提供的示例。当我之前为一个表运行 get_dll 时,它不包含列约束,
  • @sydney - 您可以选择排除或包含它们,但默认情况下应包含它们。奇怪的。您可以在答案的链接中看到选项。
  • 我找到了一种更简单的方法来做到这一点。我使用了 Oracle 数据建模器。我导入了所有对象并生成了脚本。此工具不会产生引号。去图... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2015-07-26
  • 2020-06-25
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
相关资源
最近更新 更多