我希望为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