【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
1.【YashanDB知识库】yasql执行报错2.【YashanDB知识库】YCM Monit进程频繁误告警3.【YashanDB知识库】ycm托管主机报错libnsl.so.1 no such file or directory4.【YashanDB知识库】安装共享集群时报错:YAS-05721 invalid input parameter, reason: node name invalid5.【YashanDB知识库】调用外部UDF未能识别Java环境配置6.【YashanDB知识库】个别数据库用户无法登录数据库,报错 io fail:IO.EOF7.【YashanDB知识库】过期统计信息导致SQL执行计划变差8.【YashanDB知识库】隐藏参数怎么查看初始值9.【YashanDB知识库】原生mysql驱动配置连接崖山数据库10.【YashanDB知识库】yashandb升级后,yasboot restart出现版本回退、报错control file version incompatible11.【YashanDB知识库】解压安装包时报错"tar:Error is not recoverable"12.【YashanDB知识库】如何使用MySQL客户端链接YashanDB13.【YashanDB知识库】YashanDB 单机一主一备自动切换14.【YashanDB知识库】YashanDB到YashanDB手工元数据迁移15.【YashanDB知识库】YFS_修改AU_SIZE参数16.【YashanDB知识库】YashanDB备份恢复的两种渠道17.【YashanDB知识库】YashanDB获取统计信息18.【YashanDB知识库】关于表空间压缩19.【YashanDB知识库】如何更改自动统计信息收集任务20.【YashanDB知识库】如何利用数据库线程池稳定TP吞吐21.【YashanDB知识库】为什么YashanDB只有Geometry类型,没有Geogrephy类型22.【YashanDB知识库】用crontab实现YashanDB自动备份23.【YashanDB知识库】YashanDB与Oracle数据类型对齐24.【YashanDB知识库】多csv文件一键式导入yashandb25.【YashanDB知识库】手工迁移Doris数据到崖山分布式26.【YashanDB知识库】锁冲突检查27.【YashanDB知识库】重装新库及元数据和数据导出导入指导28.【YashanDB知识库】Mybatis-Plus适配崖山配置29.【YashanDB知识库】WAS配置YashanDB JDBC连接30.【YashanDB知识库】YashanDB安全设置示例31.【YashanDB知识库】YashanDB查询时间与实际时间默认少8小时32.【YashanDB知识库】Yasldr错误处理33.【YashanDB知识库】YCM和YMP密码重置34.【YashanDB知识库】YCM数据库托管遇到的问题35.【YashanDB知识库】备库扩缩容指导36.【YashanDB知识库】非YCM方式的自动备份方案示例37.【YashanDB知识库】归档日志清理38.【YashanDB知识库】私有maven使用崖山JDBC驱动39.【YashanDB知识库】通过导入导出修改用户名称40.【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB41.【YashanDB知识库】透明故障转移配置指导42.【YashanDB知识库】MySQL的FIND_IN_SET如何在YashanDB改写43.【YashanDB知识库】对比Oracle和YashanDB对象不一致的方法44.【YashanDB知识库】MySQL的FROM_UNIXTIME和UNIX_TIMESTAMP如何在YashanDB改写45.【YashanDB知识库】YMP从oracle到yashan迁移评估报OCI相关错误46.【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉47.【YashanDB 知识库】DolphinScheduler 适配崖山 Python 驱动48.【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山49.【YashanDB知识库】Kettle迁移MySQL到YashanDB50.【YashanDB知识库】Kettle迁移PostgreSQL到YashanDB51.【YashanDB知识库】MySQL返回结果集的存储过程的改写方法52.【YashanDB知识库】沙箱备库53.【YashanDB知识库】DataX迁移Hive到崖山分布式54.【YashanDB知识库】Springboot启动找不到崖山jdbc驱动的问题处理55.【YashanDB知识库】分布式LSC表修改字段56.【YashanDB知识库】扩展redo大小57.【YashanDB知识库】共享超过32000字节字符串插入CLOB类型方案
58.【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
59.【YashanDB知识库】数据库升级后用yasboot在线扩充备节点出现报错60.【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法61.【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警62.【YashanDB知识库】MySQL field 函数的改写方法63.【YashanDB知识库】MySQL和YashanDB 隐式转换不一致引起的报错64.【YashanDB知识库】YashanDB 支持MySQL多表更新语句的解决方法65.【YashanDB知识库】从PostgreSQL迁移到YashanDB如何进行数据行数比对66.【YashanDB知识库】使用DataX工具迁移yashan数据到maxcompute67.【YashanDB知识库】如何从内存中获取SQL语句的执行计划本文内容来自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
合集:
YashanDB知识库3
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)