使用v('app\u user')作为oracle apex中列的默认值

kcugc4gi  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(396)

我正在尝试使用v('app\u user')作为列的默认值。我明白了 null 当我在select like中使用它时

select v('APP_USER') from dual;

但当我在下面的列中使用它作为默认值时,我得到了一个错误。

create table test_table (col_1 varchar2(50) default NVL(v('APP_USER'), SYS_CONTEXT('USERENV','OS_USER')));

错误

create table test_table (col_1 varchar2(50) default NVL(v('APP_USER'), SYS_CONTEXT('USERENV','OS_USER')))
Error report -
ORA-04044: procedure, function, package, or type is not allowed here
04044. 00000 -  "procedure, function, package, or type is not allowed here"

* Cause:    A procedure, function, or package was specified in an

           inappropriate place in a statement.

* Action:   Make sure the name is correct or remove it.

有人能解释一下吗?或者有个转机??

bweufnob

bweufnob1#

除了v('app\u user'),还有其他选项。自apex 5以来,app\u用户存储在sys\u上下文中,这比v()函数的性能要好得多。它可以作为 SYS_CONTEXT('APEX$SESSION','APP_USER') .
它还用作表的默认值:

create table test_table
(col_1 VARCHAR2(100) DEFAULT SYS_CONTEXT('APEX$SESSION','APP_USER'));

Table TEST_TABLE created.

也就是说,审计列的最佳实践是填充4个审计列的触发器(正如@littlefoot所建议的)。看看quicksql(在sql workshop>utilities下或livesql.oracle.com上)。如果您设置“includeauditcolumns”和“apex enabled”,您可以让它为您生成触发器。这种生成的触发器的一个例子是:

create or replace trigger employees_biu
    before insert or update 
    on employees
    for each row
begin
    if inserting then
        :new.created := sysdate;
        :new.created_by := nvl(sys_context('APEX$SESSION','APP_USER'),user);
    end if;
    :new.updated := sysdate;
    :new.updated_by := nvl(sys_context('APEX$SESSION','APP_USER'),user);
end employees_biu;
/
rqqzpn5f

rqqzpn5f2#

一种选择是使用数据库触发器,例如。

CREATE OR REPLACE TRIGGER trg_biu_test
   BEFORE INSERT OR UPDATE ON test
   FOR EACH ROW
BEGIN
   :new.col1 := v ('APP_USER');
END;
/

相关问题