print oracle error msg list

本文介绍了一个使用PL/SQL过程创建并填充错误消息表的方法。通过循环遍历预定义的错误编号范围,筛选出有效的错误消息,并将其存储到自定义的SQLERRTAB表中。此表包含两个字段:错误编号(SQLNO)和错误文本(SQLERRTEXT)。

convenient for who views all error msg

[@more@]

create table SQLERRTAB
(
SQLNO VARCHAR2(10),
SQLERRTEXT VARCHAR2(4000)
)
DECLARE
err_msg VARCHAR2(1200);
BEGIN
--dbms_output.enable (1000000);
FOR err_num IN 0.. 100000
LOOP
err_msg := SQLERRM (-err_num);
IF err_msg NOT LIKE '%Message '||err_num||' not found%' AND err_msg NOT LIKE '% non-ORACLE exception %' THEN

insert into SQLERRTAB VALUES ('ORA-'||LPAD(ERR_NUM,5,'0'),ERR_MSG);

END IF;
END LOOP;
END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/66865/viewspace-905423/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/66865/viewspace-905423/

import cx_Oracle import os import re def execute_index_statements(sql_file_path, error_file_path, db_username, db_password, db_dsn, max_retries=5): """ 循环执行SQL文件中的CREATE INDEX语句,直到所有错误都是"索引已存在"或达到最大重试次数 :param sql_file_path: 包含CREATE INDEX语句的SQL文件路径 :param error_file_path: 错误SQL语句的输出文件路径 :param db_username: 数据库用户名 :param db_password: 数据库密码 :param db_dsn: 数据库DSN连接字符串 :param max_retries: 最大重试次数 """ # 读取SQL文件并分割语句 with open(sql_file_path, 'r') as sql_file: sql_content = sql_file.read() # 分割SQL语句,保留分号 statements = [stmt.strip() + ";" for stmt in sql_content.split(';') if stmt.strip()] # 连接到Oracle数据库 try: connection = cx_Oracle.connect(user=db_username, password=db_password, dsn=db_dsn) cursor = connection.cursor() # 设置当前模式为GHANA_CASH try: cursor.execute("ALTER SESSION SET CURRENT_SCHEMA = GHANA_CASH") print("✓ 当前模式已设置为: GHANA_CASH") except cx_Oracle.DatabaseError as e: print(f"⚠️ 无法设置当前模式: {e}") print("请确保用户有权设置当前模式,或模式名称正确") # 继续执行,但索引可能无法在正确的模式下创建 # 初始化变量 all_errors = [] retry_count = 0 has_non_index_errors = True # 循环执行直到只有"索引已存在"错误或达到最大重试次数 while has_non_index_errors and retry_count <= max_retries: current_errors = [] has_non_index_errors = False print(f"\n{'=' * 50}") print(f"执行轮次 #{retry_count + 1} (共 {len(statements)} 条语句)") for stmt in statements: try: # 移除语句末尾的分号 executable_stmt = stmt.rstrip(';') cursor.execute(executable_stmt) # 提取索引名用于输出 index_name = extract_index_name(stmt) print(f"✓ 成功创建索引: {index_name}") except cx_Oracle.DatabaseError as e: error_obj, = e.args error_code = error_obj.code # 检查是否"此列列表已索引" if error_code == 1408: # ORA-01408: such column list already indexed index_name = extract_index_name(stmt) print(f"⚠️ 列列表已索引: {index_name} (ORA-01408)") else: # 记录其他错误 error_msg = f"错误语句: {stmt}\n错误代码: ORA-{error_code}\n错误信息: {error_obj.message}\n" print(error_msg) current_errors.append(stmt) all_errors.append((stmt, error_code, error_obj.message)) has_non_index_errors = True # 准备下一轮执行的语句 statements = current_errors retry_count += 1 # 写入错误文件 if all_errors: with open(error_file_path, 'w') as error_file: error_file.write("-- 以下语句在多次重试后仍执行失败:\n\n") for stmt, error_code, error_msg in all_errors: error_file.write(f"-- ORA-{error_code}: {error_msg}\n") error_file.write(f"{stmt}\n\n") print(f"\n执行完成!仍有 {len(all_errors)} 条语句失败") print(f"错误语句已保存至: {os.path.abspath(error_file_path)}") else: print("\n🎉 所有语句执行成功!无错误语句") except cx_Oracle.DatabaseError as e: print(f"数据库连接失败: {e}") finally: if 'cursor' in locals(): cursor.close() if 'connection' in locals(): connection.close() def extract_index_name(sql_statement): """从CREATE INDEX语句中提取索引名""" # 使用正则表达式匹配索引名 match = re.search(r'CREATE\s+(?:UNIQUE\s+)?INDEX\s+(\w+)\s+ON', sql_statement, re.IGNORECASE) if match: return match.group(1) return "未知索引" # 配置参数 config = { "sql_file_path": "C:\\Users\\Administrator\\PycharmProjects\\pythonProject\\oracle_comments_ghana_cash.sql", # 输入SQL文件 "error_file_path": "C:\\Users\\Administrator\\PycharmProjects\\pythonProject\\failed_indexes.sql", # 错误SQL输出文件 "db_username": "YTF", # 替换为实际用户名 "db_password": "YTF_123456", # 替换为实际密码 "db_dsn": "oracle-1.cfjq6sky0wee.ap-south-1.rds.amazonaws.com:1521/ORCL", # 替换为实际DSN "max_retries": 5 # 最大重试次数 } # 执行函数 execute_index_statements(**config)增加连接重试机制
06-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值