将列更新为默认值,而不在Spring Data JPA中指定它



我希望为DB中定义的给定列设置默认值,如本文所述,而无需从应用程序中指定。我希望OracleJDBC生成以下内容;

UPDATE TABLE_X SET COLUMN_A = default WHERE ...

或者

UPDATE TABLE_X SET COLUMN_A = systimestamp WHERE ...

由于COLUMN_A TIMESTAMP WITH TIME ZONE DEFAULT systimestamp NOT NULL

当我为列指定默认值时,JDBC会以不需要的格式生成字符串值,并且我无法自定义这种行为,这里对此进行了解释。

有没有办法通过Hibernate/JPA触发这种行为?我试图避免在应用程序中定义默认值,但在SQL中使用default关键字,以便使用Oracle端的预定义值。

我不想从数据库端得到任何解决方案,只想从应用程序端得到。

Oracle中有一个名为user_tab_cols的特殊视图,它包含有关列默认值的信息。

针对Oracle的纯SQL+PL/SQL解决方案:

返回data_default所需的函数(PL/SQL仅用于从LONG转换为VARCHAR2(:

create or replace FUNCTION get_column_data_default(
p_table_name VARCHAR2, p_column_name VARCHAR2
) RETURN VARCHAR2
AS
v_data_default_long LONG;
v_data_default_vc VARCHAR2(4000);
BEGIN
SELECT data_default 
INTO v_data_default_long 
FROM user_tab_cols
WHERE table_name = p_table_name
AND column_name = p_column_name
;
v_data_default_vc := SUBSTR(v_data_default_long, 1, 4000);
RETURN v_data_default_vc;
END get_column_data_default;
/

然后你可以写:

update TABLE_X 
set COLUMN_A = get_column_data_default('TABLE_X ', 'COLUMN_A')
where ...
;

如果你想更新特定的列,那么你可以用触发器来实现,否则你应该依赖存储过程、动态sql等。用于特定列更新使用应用程序中不适用的值执行更新脚本(比如column_a不能为-ve(您的更新声明应该如下

UPDATE TABLE_X SET COLUMN_A = -999 WHERE ...

在列更新之前创建该表的触发器_x

例如。此处编码

create table df (x number default 10, y date, z varchar2(4));
create or replace trigger df_trigger
before update of x on df
for each row
Declare
v_data_default_x number;
begin
SELECT data_default
INTO v_data_default_x
FROM user_tab_cols
WHERE table_name = 'DF'
AND column_name = 'X';
if :new.x = -999 then
:new.x := v_data_default_x;
End If;
End;
insert into df values (100, sysdate, 'test');
update df set x = -999 where z = 'test';
SQL> select * from df;
X Y         Z
---------- --------- ----
10 19-JUL-18 test

最新更新