问题: 有没有相当于dbms_system.set_int_param_in_session适用于init参数,其中值是字符串而不是整数或布尔值?
背景故事: 我遇到了第三方应用程序的问题,该应用程序的api不使用绑定变量。这会导致高CPU和性能降低,因为应用程序会反复发出相同的sql。 (硬解析)我发现将cursor_sharing参数设置为FORCE可以提高性能,但这样做存在安全问题。第三方应用程序维护很多会话(~30-50)所以我当前的方法是在第三方应用程序执行其操作期间将cursor_sharing设置为强制,然后在完成时将cursor_sharing设置回exact。缺憾?是的,非常。我们做了一些研究,发现dbms_system.set_int_param_in_session过程似乎是一个合适的解决方案,除了它只适用于数据类型为整数的init参数。是否存在具有数据类型字符串值的参数的等效项?
答案 0 :(得分:0)
虽然我不熟悉使用dbms_system,基于dbms_system
包可用的info,我尝试在会话级别使用add_parameter_value
并最终出现以下错误:
SQL> set serveroutput on
DECLARE
sid_value VARCHAR2(10);
BEGIN
dbms_system.get_env('ORACLE_SID', sid_value);
dbms_output.put_line(sid_value);
dbms_system.add_parameter_value('cursor_sharing', 'EXACT', 'MEMORY', sid_value, 4);
END;
/
show errorsSQL> 2 3 4 5 6 7 8 mydb
DECLARE
*
ERROR at line 1:
ORA-20004: cursor_sharing is not a list parameter
SQL>
因此,尝试了以下基于触发器的方法,该方法仅针对用户cursor_sharing
将force
设置为SCOTT
,您可以根据自己的要求进行更改。
SQL> create or replace trigger csf
after logon
on database
begin
if user='SCOTT' then
execute immediate 'alter session set cursor_sharing=force';
else
execute immediate 'alter session set cursor_sharing=exact';
end if;
end;
/ 2 3 4 5 6 7 8 9 10 11
Trigger created.
SQL>
SQL>
SQL> conn scott/tiger
Connected.
SQL> show parameter cursor_sharing
NAME TYPE VALUE
--------------------- --------- ---------------
cursor_sharing string FORCE
SQL>
SQL> conn system/manager
Connected.
SQL> show parameter cursor_sharing
NAME TYPE VALUE
--------------------- --------- ---------------
cursor_sharing string EXACT
SQL>
希望这可以帮助您避免将值设置回原始值。