首页 > 编程问答 >Robot Framework 数据库库调用 Oracle 存储过程失败,并出现字符到数字转换错误

Robot Framework 数据库库调用 Oracle 存储过程失败,并出现字符到数字转换错误

时间:2024-07-22 03:32:10浏览次数:6  
标签:python oracle plsql robotframework

我有一个 Oracle PL/SQL 程序,我可以直接调用如下,没有问题:

BEGIN 
    example_package_name.example_procedure(p_item_no => 123456, p_send_now => true); 
END;

(注意: p_item_no 期望a NUMBER p_send_now 期望a BOOLEAN

我正在尝试运行这个从我的 Robot Framework 测试自动化框架中,如下所示。

首先,我有一个小的帮助器包装方法 robotframework-databaselibrary

Execute SQL stored procedure
  [Arguments]
  ...  ${target_database}
  ...  ${target_stored_procedure}
  ...  ${stored_procedure_arguments}
  ...  ${timeout}=5 minutes
  [Documentation]  Small wrapper around DatabaseLibrary for the: Call stored procedure keyword.
  [Timeout]  ${timeout}

  __Open connection to target database  ${target_database}
  DatabaseLibrary.Set Auto Commit  autoCommit=${True}
  DatabaseLibrary.Call Stored Procedure  ${target_stored_procedure}  ${stored_procedure_arguments}

  Close connection from the current database

接下来,我在测试中尝试如下操作:

${item_no_int}=  Convert To Integer  ${test_item_dictionary.item_no}
${example_procedure_argument_list}=  Create List  p_item_no => ${item_no_int}  p_send_now => ${True}
Execute SQL Stored Procedure  target_database=test_db_name  target_stored_procedure=example_package_name.example_procedure  stored_procedure_arguments=${example_procedure_argument_list}

我的错误如下:

[info (+0.10s)] 执行:调用存储过程 | 示例程序包名称.示例程序 | ['p_item_no => 123456', 'p_send_now => True']

[FAIL] DatabaseError:ORA-06502: PL/SQL: 数字或值错误:字符到数字转换错误 ORA-06512: 在第 1 行帮助: https://docs.oracle.com/error-help/db/ora-06502/

自然,在离开Robot Framework、阅读文档时,我一直在努力确保我的数据是正确的类型在机器人框架上: DatabaseLibrary.Call Stored Procedure 关键字,我看到:

def call_stored_procedure(
    self, spName: str, spParams: Optional[List[str]] = None, sansTran: bool = False, alias: Optional[str] = None
):

带有描述:

调用存储过程 spName spParams - a 列表 过程所需的参数。

关键字 DatabaseLibrary.Call Stored Procedure / spParams: Optional[List[str]] 是否有可能最终没有保留预期的数据类型?或者我可能缺少其他东西?

我正在运行:

  • robotframework>=7.0.0
  • robotframework-databaselibrary>=1.4.3
  • oracledb>=2.1.0

问题在于 DatabaseLibrary.Call Stored Procedure 关键字,当你传递一个字符串列表作为参数时,它不会自动推断数据类型。所有参数都被视为字符串,导致Oracle在试图将字符串值 '123456' 插入到一个应该包含数字的列时抛出“字符到数字转换错误”。

你有几个选择可以解决这个问题:

1. 在PL/SQL代码中进行转换:

  • 最简单的解决方案是在PL/SQL存储过程中处理类型转换。修改你的存储过程以接受字符串参数,并在过程中进行显式转换:

    sql BEGIN example_package_name.example_procedure( p_item_no => TO_NUMBER(:p_item_no), p_send_now => CASE :p_send_now WHEN 'True' THEN 1 ELSE 0 END ); END; - 然后,你可以像现在这样传递参数,而无需在Robot Framework中进行任何转换。

2. 使用绑定变量:

  • 你可以利用Oracle数据库连接的绑定变量功能。这允许你将变量及其数据类型传递给数据库驱动程序,然后驱动程序将处理正确的转换。
  • 不幸的是, DatabaseLibrary.Call Stored Procedure 关键字不支持绑定变量。你需要使用 Execute SQL String 关键字并自己构造SQL语句:

    robotframework ${sql} Set Variable BEGIN example_package_name.example_procedure(p_item_no => :1, p_send_now => :2); END; ${result} Execute SQL String ${sql} ${item_no_int} ${True} - 这种方法需要更多的手动工作,但提供了更好的类型安全性和性能,因为它避免了字符串连接和SQL注入的风险。

3. 使用不同的数据库库:

  • 探索其他Robot Framework数据库库,这些库可能对存储过程调用提供更好的支持,包括数据类型处理和绑定变量。

对于你的代码,我建议使用绑定变量方法(选项2),因为它提供了更好的类型安全性和性能。

标签:python,oracle,plsql,robotframework
From: 78328798

相关文章

  • 博文标题:探索Python中的元编程:装饰器的魔法
    引言在Python的世界里,装饰器(Decorators)是一种非常强大的特性,它允许程序员在不修改原始函数代码的情况下,为函数添加新的功能。这种机制不仅增强了代码的可读性和可维护性,还提供了高度的灵活性和扩展性。本文将深入探讨装饰器的基本概念、工作原理以及如何利用它们来简化和......
  • 使用Python 和 Selenium 抓取 酷狗 音乐专辑 附源码
    在这篇博客中,我将分享如何使用Python和Selenium抓取酷狗音乐网站上的歌曲信息。我们将使用BeautifulSoup解析HTML内容,并提取歌曲和专辑信息。准备工作首先,我们需要安装一些必要的库:pipinstallrequestsbeautifulsoup4selenium代码实现以下是完整的代码:importosi......
  • 基于Django+Python的网易新闻与评论舆情热点分析平台
    一、引言在信息爆炸的时代,人们每天面对海量的信息流,如何从中筛选出有价值的信息并进行深度分析变得尤为重要。基于Django+Python的网易新闻与评论舆情热点分析平台,旨在为用户提供一个高效的数据分析工具,帮助用户快速理解新闻趋势、情感倾向以及公众对特定事件的看法。通过自......
  • Python解释器详解及其应用场景
    Python解释器及其应用场景一、Python解释器概述Python解释器是Python程序运行的核心,它负责读取Python代码(即.py文件)并将其转换为机器语言,从而使计算机能够执行。简单来说,Python解释器就像是Python代码与计算机之间的翻译官,把Python代码翻译成计算机能懂的语言。Python解释器......
  • 利用【MATLAB】和【Python】进行【图与网络模型】的高级应用与分析】
    目录一、图与网络的基本概念1.无向图与有向图2.简单图、完全图、赋权图3.顶点的度4.子图与连通性5.图的矩阵表示MATLAB代码实例Python代码实例 二、最短路径问题1.最短路径问题的定义2.Dijkstra算法MATLAB代码实例Python代码实例三、最小生成树问题1.......
  • python_wholeweek1
    目录(day1-7)一周的学习1.计算机之编程什么是编程语言什么是编程为什么要编程2.计算机组成原理计算机五大组成CPU控制器运算器内存外存输入设备输出设备(I/O设备)32位和64位32位64位多核CPU硬盘工作原理机械硬盘工作原理固态硬盘工作原理3.计算机操作系统文件是什么?应用程序是什......
  • python模块与包
    python模块与包1.模块(是一个python文件)自定义模块:(1)新建一个py文件在同一个project里然后可以用import先导入再在main里使用main.py importcc.ad(2,5)c.py defad(s,y):print(s+y)导入模块中的方法会自动实行被调用模块里所有所有语句(2)导入不同模块同一方法......
  • Python网络数据可视化全攻略【方法与技巧详解】
    ......
  • Python爬虫实战案例(爬取文字)
    爬取豆瓣电影的数据首先打开"豆瓣电影Top250"这个网页:按F12,找到网络;向上拉动,找到名称栏中的第一个,单机打开;可以在标头里看到请求URL和请求方式,复制URL(需要用到);在表头的最下面有"User-Agent",也复制下来(也可以下载pipinstallfake_useragent库,用别人写好的UA)。定位......
  • Python项目|基于Python+Django实现购物商城系统
    作者主页:编程千纸鹤作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待......