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)由可成功,但没足不了我的设计要求,请问如何才能用自定议函数作为表列的默认值?

解决方案 »

  1.   

    函数要有返回值,f_setc返回值是什么?楼主把f_setc 代码贴出来看看...
      

  2.   

    这个函数的返回值是固定的吗,
    to_char(123456)可以是因为这是个定值吧
      

  3.   

    default后面只能跟常量
    不能用函数返回值这样的变量
      

  4.   

    谢谢各位了,我的f_setc函数是根据登录用户返回一个用户的数值代码,大致内容如下:
    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不支持,不知还有什么好办法。
      

  5.   

    这么说不是很准确
    楼主将f_setc改成f_setc()试试
    看看报错提示
    :此处不允许过程、函数、程序包或类型
      

  6.   

    用触发器吧
    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;
      

  7.   

    有没有办法将自已写的函数让ORACLE当作系统函数来用呢?
      

  8.   

    前台程序改动投入成本太高了,所有涉及到这么多表的地方都要改,基本上全都要动,所以才想到这个办法,我再研究一下将自定议函数当作ORACLE函数来用的方法。
      

  9.   


    Oracle 不支持你所说的功能。 尽可能的不要用触发器在插入数据的时候处理。