看来 18c 只是报告了一个 11g 曾经默默忽略的错误;即参数名称不存在,或者至少不是过程的正确类型。在 11g 中,这没有出错,但也没有做任何事情。作为普通用户:
select name, type, display_value
from v$parameter
where name in ('max_dump_file_size', 'sort_area_size');
NAME TYPE DISPLAY_VALUE
------------------------------ ---------- ------------------------------
sort_area_size 3 65536
max_dump_file_size 2 unlimited
在识别该会话后作为 SYS:
begin
sys.dbms_system.set_int_param_in_session(
209,
34295,
'MAX_DUMP_FILE_SIZE',
123456
);
sys.dbms_system.set_int_param_in_session(
209,
34295,
'SORT_AREA_SIZE',
123456
);
end;
/
PL/SQL procedure successfully completed.
在原始用户的会话中:
select name, type, display_value
from v$parameter
where name in ('max_dump_file_size', 'sort_area_size');
NAME TYPE DISPLAY_VALUE
------------------------------ ---------- ------------------------------
sort_area_size 3 123456
max_dump_file_size 2 unlimited
更改已sort_area_size
生效。max_dump_file_size
没有——但它没有报告,也没有抱怨。事实上,你可以传递任何你喜欢的参数名,它仍然会默默地忽略它。
在 18c 中,它不再是静默的,因此您会看到 ORA-44737 错误。
它抱怨的原因似乎归结为过程的名称set_int_param_in_session
- 和参数类型。它适用,sort_area_size
因为这是一个整数参数;但是max_dump_file_size
是一个字符串参数。如果错误提示“参数 MAX_DUMP_FILE_SIZE 不存在或类型错误”可能会更有帮助,但您不能拥有所有内容。
您碰巧试图将整数值传递给它,但您可能不会 - 并且无法'UNLIMITED'
作为数字参数传递。在这种情况下,也许它可能已经被写入允许数值 - 但是你将无法重置它,这将是有问题的。
不幸的是,没有等效的set_str_param_in_session
程序,而且由于它是一个未记录且不受支持的程序包,因此您不太可能要求 Oracle 添加一个程序。
我认为没有任何方法可以执行您在另一个会话中尝试的操作。
我也不知道有什么方法可以通过配置文件或资源管理器应用它。通过一些预先计划,您可能有办法告诉 Apex(例如通过某处的参数)自行设置,但这听起来需要做很多工作。使用登录触发器总是通过调用设置它(对于某些用户,或者可能是某个角色)可能更简单alter session
,因此您在开始跟踪时不必考虑它。