【问题标题】:Define an Oracle sequence with a pattern使用模式定义 Oracle 序列
【发布时间】:2016-09-14 23:06:33
【问题描述】:

首先,我希望这种问题被接受,意思是对问题的反思(相当复杂)和可能的解决方案(即使是简单的想法也受到欢迎)。

让我们一起去头脑风暴的世界吧!

假设我有一个表“product”,其中有两个字段,分别称为“prd_id”和“prd_num”。 - “prd_id”是主键,并以 Oracle 序列 (mySeq.nextval) 递增。 - “prd_num”是“prd_id”的副本,主要用于显示/逻辑目的。

问题是“prd_num”对于用户来说变得太复杂了(就其用途而言)。

因此我们的想法是创建一个新序列,该序列将随着“prd_id”(使用旧序列)的增加而增加字段“prd_num”,但这里的不同之处在于我们能够指定某种模式(可能使用 xml 配置文件等。)基于使用应用程序的客户端(客户端之间的区别是通过“产品”表中的另一个字段完成的。

示例:对于 client1,我们将定义模式“CLT1XXXX”,其中 XXXX 是一个简单的增量。

SO => 我不认为 Oracle 可以处理这种类型的序列(以某种模式将字母与数字混合),因此欢迎 Java/hibernate 中的任何想法。

希望听到一些想法!

【问题讨论】:

  • 预言机序列只会生成一个数字。您可以构建一个 PL/SQL 函数,在前面添加您想要的任何内容。但是如果prd_num是数字,就不能存到表中了。
  • 如果需要,我也可以改变它的结构。
  • 您最好使用 pl/sql 函数将值添加到序列中,将连接的前缀和序列值返回到(例如)插入语句。作为记录,您也可以在普通的 sql 查询中执行此操作。 "select 'CLT1'||to_char(myval_from_sequence) from sequence_name",例如。

标签: java oracle hibernate sequence


【解决方案1】:

您可以使用触发器,例如BEFORE INSERT 触发器。这样,您就可以根据其他列的值用一个值填充该列。

例如:

create or replace trigger product_insert
before insert on product
begin
  :new.prd_num := :new.column_with_client_distinction || to_char(:new.prd_id);
end;
/

(请注意,Hibernate 不会自动识别由触发器填充的任何列值)。

【讨论】:

  • 这是一个很好的解决方案,它可以帮助我很多!但是,Hibernate 无法意识到填充列的触发器会有什么问题?我的意思是当我进行选择(或更新或其他)时,Hibernate 将进入数据库并获取触发器设置的值..
  • 是的。然而,在某些情况下,Hibernate 不会再次从数据库中获取记录(例如,直接在保存之后),因为它认为它已经知道所有当前列值并试图最小化数据库往返。
  • 缓存!该死的大声笑,也许有一个解决方法..我会深入研究休眠缓存的文档。无论如何,谢谢你的想法;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多