如何解决cx_Oracle.DatabaseError: ORA-01036非法变量名/编号错误
解决cx_Oracle插入Oracle时的ORA-01036错误
错误原因及修复步骤
1. 占位符使用错误
cx_Oracle不支持%s作为SQL占位符,Oracle数据库绑定变量需要使用冒号加序号(如:1、:2)或命名占位符。原代码中的VALUES (%s, %s, %s, %s, %s)会导致变量匹配失败,触发ORA-01036错误。
2. 变量名拼写错误
代码中定义的变量是kills,但后续拼接元组时用了skills,这会导致未定义变量报错,同时影响数据插入的正确性。
3. 重复创建数据库连接与游标
循环内部重复执行cnx = cx_Oracle.connect(conStr)和cursor = cnx.cursor()会浪费资源且逻辑混乱,应在循环外初始化一次连接和游标。
4. 缩进错误
原代码中cnx = cx_Oracle.connect(conStr)、cursor.executemany等语句缩进错误,导致代码逻辑执行顺序混乱,部分语句无法正确触发。
修正后的完整代码
import requests from bs4 import BeautifulSoup import cx_Oracle # 初始化数据库连接与游标 conStr = 'system/Maxesafrica2@localhost:1521/orclXDB' cnx = cx_Oracle.connect(conStr) cursor = cnx.cursor() print("Connected to Database!") html_text = requests.get('https://www.jobberman.com/jobs/hospitality-leisure').text soup = BeautifulSoup(html_text, 'lxml') jobs = soup.find_all('div', class_ = 'mx-5 md:mx-0 flex flex-wrap col-span-1 mb-5 bg-white rounded-lg border border-gray-300 hover:border-gray-400 focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-gray-500') salary_scale = '' job_list = [] for job in jobs: company_name = job.find('p', class_ = 'text-sm text-brand-linked').get_text(strip=True) # 修正变量名拼写错误:kills -> skills skills = job.find('p', class_ = 'text-lg font-medium break-words text-brand-linked').get_text(strip=True) job_desc = job.find('p', class_ = 'text-sm font-normal text-gray-700 md:text-gray-500 md:pl-5').get_text(strip=True) job_link = job.find("a", href=True)["href"] salary_scale1 = job.find('span', class_ = 'mr-1') if salary_scale1: salary_scale = salary_scale1.get_text(strip=True) else: salary_scale = 'Not Mentioned' all_details = (company_name, skills, job_desc, job_link, salary_scale) job_list.append(all_details) # 将占位符改为cx_Oracle支持的格式 insert_query = """INSERT INTO jobberman_tbl (company_name, skills, job_desc, job_link, salary_scale) VALUES (:1, :2, :3, :4, :5)""" # 批量插入数据 cursor.executemany(insert_query, job_list) cnx.commit() # 关闭游标与连接 cursor.close() cnx.close() print('Done!')
额外说明
- 如果偏好命名占位符,也可以将SQL语句写成:
此时INSERT INTO jobberman_tbl (company_name, skills, job_desc, job_link, salary_scale) VALUES (:company_name, :skills, :job_desc, :job_link, :salary_scale)job_list中的元素需要是字典类型,例如:all_details = { "company_name": company_name, "skills": skills, "job_desc": job_desc, "job_link": job_link, "salary_scale": salary_scale }
内容的提问来源于stack exchange,提问作者Miracle
相关产品推荐
相关产品推荐

