create table t_test(
a number(5) default 0 NOT NULL,
b varchar2(20),
c char(6) default f_setc not null);其中:f_setc是自定议函数,执行时ORQCLE报:ORA-00984: 列在此处不允许,但如果我将f_setc换成系统函数如:to_char(123456)由可成功,但没足不了我的设计要求,请问如何才能用自定议函数作为表列的默认值?
a number(5) default 0 NOT NULL,
b varchar2(20),
c char(6) default f_setc not null);其中:f_setc是自定议函数,执行时ORQCLE报:ORA-00984: 列在此处不允许,但如果我将f_setc换成系统函数如:to_char(123456)由可成功,但没足不了我的设计要求,请问如何才能用自定议函数作为表列的默认值?
解决方案 »
- 求update语句,我要把value字段的值的长度截取到10位。
- 值过多,报错
- 纵表如何转横表??
- PRO*C程序预编译通过,但是联编出现LNK2001问题 (高分求助 !)
- select * from bable where row <5 为什么不行啊,该怎么样写,谢谢
- 谁给介绍一下oracle dba studio的功能
- 初学者问题:要在自己的机上安装pl/sql developer连服务器的oracle9i,要先装什么?oracle9i客户端吗?
- 在oracle保存二进制文件的问题,在线,给分
- 关于双机备份的解决方案
- 数据库菜鸟的问题!
- 何以是“游标的非游标属性”
- ora-14137问题,急!在线等。
to_char(123456)可以是因为这是个定值吧
不能用函数返回值这样的变量
CREATE OR REPLACE FUNCTION f_setc RETURN VARCHAR2 IS
RESULT VARCHAR2(6);
v_user VARCHAR2(30);
BEGIN
v_user := sys_context('USERENV', 'SESSION_USER');
IF v_user = 'GYDS_TCTB' THEN
RESULT := sys_context('XXXXX', 'XXXX');
ELSE
SELECT substr(paramvalue, 1, 6)
INTO RESULT
FROM sys_param
WHERE paramname = 'v_sbh';
END IF;
RETURN(RESULT);
END f_setc;如我将C列的默认值改为sys_context('SUPER', 'DWID')也没有问题,即可知使用系统函数是没有问题的,但我的应用只能用自定议函数实现,但是ORACLE不支持,不知还有什么好办法。
楼主将f_setc改成f_setc()试试
看看报错提示
:此处不允许过程、函数、程序包或类型
create or replace trigger tg_test
before insert on t_test
for each row
begin
if :new.c is null then
:new.c:=f_setc;
end if;
end tg_test;
Oracle 不支持你所说的功能。 尽可能的不要用触发器在插入数据的时候处理。