【问题标题】:Can I use an Oracle trigger to force a varchar column to fit column width?我可以使用 Oracle 触发器来强制 varchar 列适应列宽吗?
【发布时间】:2016-12-16 16:50:18
【问题描述】:

我有一个应用程序偶尔会被传递数据,这会导致它在尝试将记录插入 Oracle 11g 数据库上的 varchar(2000) 列时失败并出现 ORA-12899 错误。 )在某些情况下,它会尝试插入超过 4000 个字符的字段。)

从长远来看,我将请求更改应用程序以防止这种情况发生,但同时我需要一个短期修复以允许保存记录,将数据截断为 2000 个字符。

我尝试过使用“插入前”触发器(将其从 1500 到 1000 个字符截断时效果很好),但我发现数据超过 2000 个字符(即超过列长度​​)插入仍然失败并出现 ORA-12899。

除了将数据库列更改为 CLOB 之外,还有什么办法可以解决这个问题?

【问题讨论】:

  • 应用程序是作为表所有者连接到数据库,还是以模式前缀引用表?如果不是 - 所以它使用同义词 = 您是否允许以用户身份创建视图 连接身份?
  • 嗨,亚历克斯,我认为这一定是某个不同问题的答案?我不是在询问创建视图的权利。
  • 不,是给这个的。一种可能的解决方法是拥有一个仅从表中选择的视图,使用instead of 触发器而不是 substr 作为插入真实表的一部分。但是由于您无法更改应用程序,因此它当前必须以一种允许您根据名称解析顺序欺骗它使用视图的方式访问表。如果您可以在有关应用程序如何连接到数据库并运行插入的问题中添加信息,那将很有帮助。
  • 哦,鬼鬼祟祟!我怀疑它会因为太混乱而被否决,但这是一个好主意。为了回答您的问题,应用程序正在以表所有者的身份进行连接。
  • 那么你不能这样做,很遗憾;您不能在同一架构中拥有与表同名的视图,并且该表将优先于同义词。耻辱。

标签: oracle oracle11g triggers


【解决方案1】:

在插入命令中包含类似于以下代码的 case 语句

insert into test_table
  (column1)
values
(  
  (case when length('ablekkkkkkkkkkkh') > 2000 then substr('ablekkkkkkkkh',1,2000)
   else 'ablekkkkkkkkkkkh' end )
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2020-08-14
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多