【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
相关文章
|
7月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
490 8
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
453 6
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
SQL Oracle 关系型数据库
|
SQL 存储 关系型数据库
【YashanDB知识库】如何从内存中获取SQL语句的执行计划
【YashanDB知识库】如何从内存中获取SQL语句的执行计划
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL 关系型数据库 Oracle
ORACLE SQL优化之ORA-03150&ORA-02055&ORA-02063
                                                                                                             >   
5130 0
|
SQL Oracle 关系型数据库
Oracle SQL优化之多表连接
Oracle SQL优化之多表连接
870 0
Oracle SQL优化之多表连接
|
SQL 存储 Oracle
Oracle数据库 | SQL语句执行计划、语句跟踪与优化实例
Oracle数据库 | SQL语句执行计划、语句跟踪与优化实例
561 0
|
SQL 存储 Oracle
Oracle SQL语句优化方法总结
  1、SQL语句尽量用大写的   因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。   2、使用表的别名   当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来,   就可以减少解析的时间并减少那些由列歧义引起的语法错误。   3、选择最有效率的表名顺序(只在基于规则的优化器(RBO)中有效)
346 0
下一篇
开通oss服务