【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法

简介: 本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。

本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7508312.html?templateId=1718516

简介
Oracle客户端sql*plus正在执行某SQL脚本,当该SQL脚本调用同级目录的SQL脚本,会使用@@,请看详情的Oracle示例。崖山数据库23.2.x.100已支持@@用法,但是对于以前的版本,可以用Python脚本进行批量重写,对于存在@@调用的SQL文件,用SQL文件所在的绝对路径进行替换。

详情
Oracle示例
Oracle示例是在Windows上通过批处理脚本执行。

Windows批处理脚本

set ForkPath=%~dp0

echo %ForkPath%



cd %ForkPath%

sqlplus xxx/xxx@xxx @1/demo1.sql



pause

入口SQL脚本(1/demo1.sql)

1/demo1.sql

spool demo1.log

@@demo1_1.sql

@@demo1_2.sql

spool off

exit

入口SQL脚本(1/demo1.sql)调用同级目录的SQL脚本(1/demo1_1.sql和demo1_2)

1/demo1_1.sql

select 'demo1_1' from dual;
1/demo1_2.sql

select 'demo1_2' from dual;

Python脚本
Windows的Python脚本如下,如果运行在Linux上,请调整这一行newlines.append(line.replace("@@","@" + filename_dirname + "\", 1))的'\'为'/'即可

rewrite_o2y.py

import os



def get_all_files(root_path):

    """

    递归获取指定路径下所有文件的绝对路径

    :param root_path: 需要递归的根目录路径

    :return: 文件绝对路径列表

    """

    # 初始化文件列表

    all_files = []



    # 获取根目录下的所有文件和目录

    for dir_path, dir_names, file_names in os.walk(root_path):

        # 遍历文件

        for file_name in file_names:

            # 获取文件的绝对路径并添加到列表中

            file_path = os.path.join(dir_path, file_name)

            all_files.append(file_path)



    return all_files





if __name__ == '__main__':

    # 获取脚本所在路径

    current_path = os.path.dirname(os.path.abspath(__file__))

    print("当前目录是:", current_path)



    filenames = get_all_files(current_path)

    for filename in filenames:

        if filename.endswith(".sql"):

            filename_dirname = os.path.dirname(filename)

            filename_basename = os.path.basename(filename)

            filename_orig = filename + ".orig"



            print("\n当前处理: "+filename)

            # 读取所有行

            with open(filename, 'r') as file:

                lines = file.readlines()



            need_rename_file = False

            newlines = []

            for line in lines:

                # 替换以@@为@+绝对路径

                if line.startswith("@@"):

                    newlines.append(line.replace("@@","@" + filename_dirname + "\\", 1))

                    need_rename_file = True

                else:

                    newlines.append(line)



            for newline in newlines:

                print(newline, end="")



            if need_rename_file:

                # 重命名文件

                os.rename(filename, filename_orig)

                # 写回文件

                with open(filename, 'w') as file:

                    file.writelines(newlines)



            print("\n处理完毕: " + filename)

用法

cd %Oracle示例所在的目录%

python rewrite_o2y.py

运行

D:\Workspace\Demo\python_demo>python rewrite_o2y.py

当前目录是: D:\Workspace\Demo\python_demo



当前处理: D:\Workspace\Demo\python_demo\demo2\1\demo1.sql

spool demo1.log

@D:\Workspace\Demo\python_demo\demo2\1\demo1_1.sql

@D:\Workspace\Demo\python_demo\demo2\1\demo1_2.sql

spool off

exit

处理完毕: D:\Workspace\Demo\python_demo\demo2\1\demo1.sql



当前处理: D:\Workspace\Demo\python_demo\demo2\1\demo1_1.sql

select 'demo1_1' from dual;

处理完毕: D:\Workspace\Demo\python_demo\demo2\1\demo1_1.sql



当前处理: D:\Workspace\Demo\python_demo\demo2\1\demo1_2.sql

select 'demo1_2' from dual;

处理完毕: D:\Workspace\Demo\python_demo\demo2\1\demo1_2.sql

结果
入口SQL脚本(1/demo1.sql)的@@被替换成绝对路径

1/demo1.sql

spool demo1.log

@D:\Workspace\Demo\python_demo\demo2\1\demo1_1.sql

@D:\Workspace\Demo\python_demo\demo2\1\demo1_2.sql

spool off

exit

原入口SQL脚本(1/demo1.sql)被重命名为(1/demo1.sql.orig)

1/demo1.sql.orig

spool demo1.log

@@demo1_1.sql

@@demo1_2.sql

spool off

exit

其他SQL文件都保持不变,然后调整批处理脚本即可在YashanDB运行

Windows批处理脚本

set ForkPath=%~dp0

echo %ForkPath%



cd %ForkPath%

yasql xxx/xxx@xx.xx.x.x:xxxx -f 1/demo1.sql



pause
相关文章
|
JSON 算法 API
深度分析小红书城API接口,用Python脚本实现
小红书作为以UGC内容为核心的生活方式平台,其非官方API主要通过移动端抓包解析获得,涵盖内容推荐、搜索、笔记详情、用户信息和互动操作等功能。本文分析了其接口体系、认证机制及请求规范,并提供基于Python的调用框架,涉及签名生成、登录态管理与数据解析。需注意非官方接口存在稳定性与合规风险,使用时应遵守平台协议及法律法规。
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
757 8
|
JSON API 开发者
深度分析阿里妈妈API接口,用Python脚本实现
阿里妈妈是阿里巴巴旗下营销平台,提供淘宝联盟、直通车等服务,支持推广位管理、商品查询等API功能。本文详解其API调用方法,重点实现商品推广信息(佣金、优惠券)获取,并提供Python实现方案。
|
JSON API 数据安全/隐私保护
深度分析虾皮城API接口,用Python脚本实现
虾皮开放平台提供丰富的API接口,支持商品管理、订单处理及促销信息查询等功能。本文详解API认证机制与调用方法,基于Python实现商品价格及到手价获取方案,适用于电商数据分析与运营。
|
API 数据安全/隐私保护 开发者
深度分析苏宁API接口,用Python脚本实现
深度分析苏宁API接口,用Python脚本实现
|
前端开发 Shell API
深度分析58同城API接口,用Python脚本实现
58同城为国内知名分类信息平台,涵盖房产、招聘、二手车等多领域。本文基于网页抓包与解析,分享其非官方接口的Python实现方案,分析核心接口特性与反爬应对策略,适用于数据学习与信息聚合。注意:非官方接口存在风险,使用需遵守平台规则。
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
1079 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
796 9
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
480 6