Sql Oracle 12c数据默认值

Sql Oracle 12c数据默认值,sql,string,oracle,plsql,oracle12c,Sql,String,Oracle,Plsql,Oracle12c,Oracle数据库12c企业版12.1.0.2.0版-64位生产版 表: CREATE TABLE t1 ( c1 VARCHAR2(100 CHAR) DEFAULT 'SOME DATA' NOT NULL, c2 DATE DEFAULT SYSDATE NOT NULL, c3 NUMBER DEFAULT 10 NOT NULL); 选择: BEGIN FOR c IN (SELECT * FROM user_tab_columns WHERE table_nam

Oracle数据库12c企业版12.1.0.2.0版-64位生产版

表:

CREATE TABLE t1 (
  c1 VARCHAR2(100 CHAR) DEFAULT 'SOME DATA' NOT NULL, 
  c2 DATE DEFAULT SYSDATE NOT NULL, 
  c3 NUMBER DEFAULT 10 NOT NULL);
选择:

BEGIN
  FOR c IN (SELECT * FROM user_tab_columns WHERE table_name = 'T1') LOOP
    DBMS_output.put_line('"' || c.data_default || '"');
  END LOOP;
END;
结果:

"'SOME DATA' "
"SYSDATE "
"10 "
"10 "
Typ=1 Len=3: 49,48,32
"SYSDATE "
Typ=1 Len=8: 83,89,83,68,65,84,69,32
"'SOME DATA' "
Typ=1 Len=12: 39,83,79,77,69,32,68,65,84,65,39,32
为什么
数据默认值
末尾有空格?我需要比较Oracle dictionnary中的数据默认值和项目元数据中的数据默认值,但这个空间会破坏比较

编辑:@GordonLinoff问“额外的字符真的是空格吗?” 由于
LONG
datatype的
DATA\u DEFAULT
列,我只找到了一个测试:

DECLARE
  l_ret   VARCHAR2(32000);
  l_dump  VARCHAR2(32000);
BEGIN
  FOR c IN (SELECT * FROM user_tab_columns WHERE table_name = 'T1') LOOP
    DBMS_output.put_line('"' || c.data_default || '"');
    l_ret := c.data_default;
    SELECT dump(l_ret) 
      INTO l_dump
      FROM dual;
    DBMS_output.put_line(l_dump);
  END LOOP;
END;
结果:

"'SOME DATA' "
"SYSDATE "
"10 "
"10 "
Typ=1 Len=3: 49,48,32
"SYSDATE "
Typ=1 Len=8: 83,89,83,68,65,84,69,32
"'SOME DATA' "
Typ=1 Len=12: 39,83,79,77,69,32,68,65,84,65,39,32
因此,它是一个空格(32)。

您可以只
trim()

BEGIN
  FOR c IN (SELECT * FROM user_tab_columns WHERE table_name = 'T1') LOOP
    DBMS_output.put_line('"' || trim(c.data_default) || '"');
  END LOOP;
END;
/
有趣

一个简单的测试表明,只有当为其定义默认值的列声明为NOTNULL时,才会添加额外的空间。(因此,与@GordonLinoff推测的相反,这不是一个默认值被存储得太长的工件。)

甲骨文为什么这么做。。。谁知道呢

在任何情况下,当您将字典中的默认值与规范(项目元数据)进行比较时,最简单的解决方案似乎是在比较中的另一个术语末尾有条件地添加一个尾随空格。(以列是否为空为条件。)


或者,如果确实需要直接操作声称的默认值,还可以从用户选项卡列检索默认长度值,以便可以轻松地仅删除尾随空间(当该列不可为空时),同时保留可能是实际所需默认值一部分的任何尾随空间。(例如:对于非空文本列,默认值正好是一个空格;默认值报告为两个空格,您只需要修剪第二个空格,而不修剪第一个空格。)

。我怀疑这是默认值存储为
long
的产物。额外的字符真的是一个空格,还是看起来像一个空格;它正在查看数据字典中表的定义。那么,只要甲骨文处理得当,这会有什么不同呢?@Belayer-OP非常清楚地解释了(在我看来)他是如何使用它的。他正在将“Oracle知道的”(即数据字典)与他的规范进行比较,以确保
create table
语句按照规范正确执行。这应该在表中填充任何实际数据之前提前完成。你现在明白这有什么区别了吗?您不希望等到填充数据后再查看默认值是否正常。
trim
不是一个好的解决方案;默认值可能包含前导空格或尾随空格,这些空格应该保留,但它们将与不需要的最后一个空格一起被修剪掉。