Shell脚本中设置Oracle当前Schema(test3)无效,请求协助解决
问题分析与解决方案
我明白你遇到的问题了——你单独执行的ALTER SESSION SET CURRENT_SCHEMA = test3其实是生效的,但只在当前那个sqlplus会话里有效。一旦这个sqlplus进程退出,会话就结束了,设置的默认schema也就跟着失效了。如果你的Shell脚本后续还有其他调用sqlplus的命令,那都是全新的会话,不会继承之前的设置,这就是为什么你感觉没生效。
下面给你几个实用的解决办法:
方法1:把Schema设置和业务操作放在同一个sqlplus会话里
如果你的脚本需要调用test3下的对象,直接把ALTER SESSION和后续的执行语句放在同一个EOF块里,这样整个操作都在同一个会话中,schema设置会一直生效:
sqlplus -s apple/orange <<EOF WHENEVER SQLERROR EXIT SQL.SQLCODE set linesize 80 set pages 0 set echo off set feed off set feedback off set term off set verify off ALTER SESSION SET CURRENT_SCHEMA = test3; -- 在这里直接执行test3 schema下的包、函数或存储过程 EXEC your_package.your_procedure(); SELECT your_function() FROM DUAL; exit; EOF
方法2:创建登录触发器自动设置默认Schema
如果不想每次写sqlplus块都加ALTER SESSION,可以让apple用户登录时自动切换到test3 schema。你可以(或让DBA帮忙)创建一个登录触发器:
-- 用apple用户登录后执行这段SQL CREATE OR REPLACE TRIGGER set_current_schema_on_login AFTER LOGON ON apple.SCHEMA BEGIN EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = test3'; END; /
之后只要用apple账号登录sqlplus,会话会自动把默认schema设为test3,不需要手动执行设置语句了。
方法3:直接指定Schema访问对象
如果上面两种方式都不适合,你也可以在调用对象时直接加上schema前缀,比如:
EXEC test3.your_package.your_procedure(); SELECT test3.your_function() FROM DUAL;
这样不需要设置current schema也能访问到test3下的对象,缺点是每个调用都要写schema名,有点繁琐,但胜在直观。
内容的提问来源于stack exchange,提问作者teepu
相关产品推荐
相关产品推荐

