如何在SQL脚本中跨目录调用其他文件夹的存储过程
SQL跨目录调用存储过程/切换脚本工作目录方案
首先明确核心逻辑:存储过程是归属于数据库schema的对象,一旦部署到数据库中,就和你本地SQL脚本存放的文件系统目录没有任何关联,不存在“跨目录调用库内存储过程”的问题。只有当目标存储过程的定义代码保存在其他目录的独立SQL文件中、尚未加载到数据库时,才需要处理文件路径相关的问题,具体方案如下:
库内已部署存储过程的调用方式
不管你当前执行的SQL脚本在本地哪个文件夹,只要存储过程已经创建到目标数据库,直接写对应语法调用即可,不需要处理目录:
- MySQL/MariaDB/PostgreSQL:使用
CALL 存储过程名(参数列表);调用 - SQL Server:使用
EXEC 存储过程名 @参数名=参数值;调用 - Oracle:使用
EXECUTE 存储过程名(参数列表);调用
如果存储过程不在当前连接的默认schema下,调用时补全schema名即可,例如
CALL analytics.calc_monthly_report();,和本地文件路径完全无关。
存储过程定义在其他目录SQL文件中的处理方式
如果存储过程还没部署到库,定义代码存在其他目录的.sql文件里,可以通过客户端原生指令直接跨目录加载,或者临时切换工作目录,不需要修改系统环境变量:
- 直接加载跨目录脚本(推荐,不需要切换目录):
主流命令行客户端都支持直接传入文件的相对路径/绝对路径加载执行,比如当前脚本存放在/opt/sql/job/目录,存储过程定义文件存放在/opt/sql/common/proc.sql,可以直接在当前脚本里写加载指令:-- MySQL命令行客户端写法 source /opt/sql/common/proc.sql; -- 相对路径写法:从当前脚本所在目录返回上级目录后进入common文件夹 source ../common/proc.sql; -- 加载完成后直接调用存储过程 CALL your_proc_name();-- PostgreSQL psql客户端写法 \i '/opt/sql/common/proc.sql' CALL your_proc_name();-- SQL Server sqlcmd客户端写法 :r C:\sql\common\proc.sql EXEC your_proc_name; - 临时切换工作目录:
如果需要批量加载同一目录下的多个存储过程脚本,可以先切换客户端的工作目录再加载文件,不需要退出客户端重进:-- MySQL客户端切换工作目录 \cd /opt/sql/common source proc1.sql; source proc2.sql;-- psql客户端切换工作目录 \cd /opt/sql/common \i proc1.sql \i proc2.sql - 可视化客户端(Navicat、DBeaver、DataGrip等)场景:
只要把存储过程脚本打开执行一次、部署到数据库后,后续所有脚本不管存在本地哪个目录,都可以直接调用存储过程,不需要反复处理文件路径。
内容的提问来源于stack exchange,提问作者Stella Hansen
相关产品推荐
相关产品推荐

