You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:10:28