使用 v('APP_USER') 作为 Oracle Apex 中列的默认值
Use v('APP_USER') as default value for column in Oracle Apex
我正在尝试使用 v('APP_USER') 作为列的默认值。当我在 select 中使用它时,我得到 null
就像
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.
任何人都可以对此进行解释或对此进行周转吗??
一种选择是使用数据库触发器,例如
CREATE OR REPLACE TRIGGER trg_biu_test
BEFORE INSERT OR UPDATE ON test
FOR EACH ROW
BEGIN
:new.col1 := v ('APP_USER');
END;
/
除了V('APP_USER')还有其他选项。从 Apex 5 开始,APP_USER 存储在 sys_context 中,这比 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 下)。如果您设置“包含审计列”和“启用 Apex”,您可以让它为您生成触发器。此类生成的触发器的示例是:
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;
/
我正在尝试使用 v('APP_USER') 作为列的默认值。当我在 select 中使用它时,我得到 null
就像
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.
任何人都可以对此进行解释或对此进行周转吗??
一种选择是使用数据库触发器,例如
CREATE OR REPLACE TRIGGER trg_biu_test
BEFORE INSERT OR UPDATE ON test
FOR EACH ROW
BEGIN
:new.col1 := v ('APP_USER');
END;
/
除了V('APP_USER')还有其他选项。从 Apex 5 开始,APP_USER 存储在 sys_context 中,这比 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 下)。如果您设置“包含审计列”和“启用 Apex”,您可以让它为您生成触发器。此类生成的触发器的示例是:
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;
/