[20240815]oracle21c环境变量ORACLE_PATH与SQLPATH(windows).txt
--//我记忆以前测试过这个问题,当时是家里的笔记本,安装oracle 12.2c for windows.OS:windows 7,发现无法访问SQLPATH或者
--//ORACLE_PATH环境变量定义的路径下login.sql文件.我当时解决办法就是登录手工执行init.sql命令,主要原因我自己也不常开启数据
--//库.
--//参考链接:[20230124]12c访问login.sql脚本.txt=>
--//当时的总结如下:
--//1.windows下至少我的测试版本12c对于ORACLE_PATH,SQLPATH定义无效,指缺省访问login.sql文件,以下情况类似.
--//2.linux下11g版本可以定义ORACLE_PATH,SQLPATH有效,建议仅仅使用ORACLE_PATH环境变量.
--//3.linux下12c以后版本仅仅定义ORACLE_PATH有效.
--//4.也是oracle出于安全的原因做出这样的修改操作.
--//4.链接https://blog.dbi-services.com/oracle-12cr2-changes-for-login-sql/给出许多测试.
--//5.我个人建立不要ORACLE_PATH或者SQLPATH定义多个访问目录路径,这样容易混乱.
--//这次遇到的情况不同客户端:OS windows 10,sqlplus的版本是21c, 数据库是21c for linux, 可以访问SQLPATH或者ORACLE_PATH环境
--//变量的login.sql脚本,到底一个起作用看下面的测试.
--//oracle升级新版本,总是做一些改进,测试看看windows 10,客户端21c 的sqlplus的情况.
1.环境:
[email protected]:1521/book> @ prxx
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 21.0.0.0.0
BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.测试环境建立:
d:\tmp\study>mkdir ORACLE_PATH
d:\tmp\study>mkdir SQLPATH
--//分别在两个子目录上建立login.sql文件.
d:\tmp\study>cat ORACLE_PATH\login.sql
prompt Hello from D:\tmp\study\ORACLE_PATH\login.sql
d:\tmp\study>cat SQLPATH\login.sql
prompt Hello from D:\tmp\study\SQLPATH\login.sql
--//测试脚本:
d:\tmp\study>cat o1.bat
rem @echo off
set ORACLE_PATH=D:\tmp\study\ORACLE_PATH
set SQLPATH=D:\tmp\study\SQLPATH
echo select sysdate from dual ; | sqlplus -s -l system/[email protected]:1521/book
3.测试:
--//看看使用那个环境变量参数或者那个优先使用:
d:\tmp\study>o1
d:\tmp\study>rem @echo off
d:\tmp\study>set ORACLE_PATH=D:\tmp\study\ORACLE_PATH
d:\tmp\study>set SQLPATH=D:\tmp\study\SQLPATH
d:\tmp\study>echo select sysdate from dual ; | sqlplus -s -l system/[email protected]:1521/book
Hello from D:\tmp\study\SQLPATH\login.sql
SYSDATE
-------------------
2024-08-15 16:09:35
--//很明显使用的是SQLPATH环境变量,ORACLE_PATH无效.
d:\tmp\study>sqlplus -s -l system/[email protected]:1521/book
Hello from D:\tmp\study\SQLPATH\login.sql
@login
Hello from D:\tmp\study\SQLPATH\login.sql
--//执行login.sql,查询路径也是SQLPATH环境变量.
--//改名ORACLE_PATH/login.sql
D:\tmp\study> mv ORACLE_PATH/login.sql ORACLE_PATH/login1.sql
--//切换到sqlplus界面执行:
@login1
SP2-0310: unable to open file "login1.sql"
@d:/tmp/study/ORACLE_PATH/login1.sql
Hello from D:\tmp\study\ORACLE_PATH\login.sql
--//修改回来
D:\tmp\study> mv ORACLE_PATH/login1.sql ORACLE_PATH/login.sql
--//说明:在windows下oracle 21c的sqlplus客户端不会使用ORACLE_PATH环境访问sql脚本.
4.-R 3 参数测试:
d:\tmp\study>o1
d:\tmp\study>rem @echo off
d:\tmp\study>set ORACLE_PATH=D:\tmp\study\ORACLE_PATH
d:\tmp\study>set SQLPATH=D:\tmp\study\SQLPATH
d:\tmp\study>echo select sysdate from dual ; | sqlplus -s -l -R 3 system/[email protected]:1521/book
SP2-0738: Restricted command "@@ (START)" not available
SP2-0738: Restricted command "@@ (START)" not available
--//注:这里出现错误是访问ORACLE_HOME目录下sqlplus/admin/glogin.sql.
--//该文件就2行,出现2次@@,如果在glogin.sql里面定义一些set或者sql命令还是会执行的,大家可以自行测试。
--//也就是最高级别-R 3 依旧会访问并执行ORACLE_HOME目录下sqlplus/admin/glogin.sql脚本,但是里面@或者@@调用的脚本不会执行.
SYSDATE
-------------------
2024-08-15 16:22:37
--//我的glogin.sql脚本就2行:
@@zzlogin.sql
@@128.txt
--//测试:-R 1,2 好像没有什么效果.与没有使用没有什么区别.
d:\tmp\study>o1
d:\tmp\study>rem @echo off
d:\tmp\study>set ORACLE_PATH=D:\tmp\study\ORACLE_PATH
d:\tmp\study>set SQLPATH=D:\tmp\study\SQLPATH
d:\tmp\study>echo select sysdate from dual ; | sqlplus -s -l -R 2 system/[email protected]:1521/book
Hello from D:\tmp\study\SQLPATH\login.sql
SYSDATE
-------------------
2024-08-16 15:46:16
--//没有前面的SP2-0738提示,说明会访问执行$ORACLE_HOME/sqlplus/admin/glogin.sql脚本,并且里面@或者@@调用的脚本会执行.
--//其次会访问并执行SQLPATH环境变量设置目录的loing.sql脚本.
5.总结:
--//在windows下21c的sqlplus客户端,设置SQLPATH有效.ORACLE_PATH无效.
--//sqlplus选择-R 3参数,依旧会访问ORACLE_HOME目录下sqlplus/admin/glogin.sql,里面@或者@@调用的脚本不会执行.
--//也不会访问SQLPATH的设置的目录.
--//我感觉不管怎么环境,最好两个环境变量都设置一样.
--//个人建议不要ORACLE_PATH或者SQLPATH定义多个访问目录路径,这样容易混乱.