调用过程默认值而不将值绑定到 Jdbc 中的参数

2024-05-01

我正在尝试打电话PL/SQL为其某些参数定义了默认值的过程。我正在这样做使用CallableStatement in JDBC.

该过程有大量已定义默认值的参数。我不想在 Java 代码中显式设置默认值。这样做会使维护代码变得更加困难。如果 PL/SQL 代码发生更改,则也必须在 Java 代码中进行相同的更改。

是否有可能在 JDBC 中实现这一点?例如,只需将值绑定到您感兴趣的参数并忽略其余的。

我在以下示例程序中尝试了这一点:

  -- PURPOSE: Takes a parameter which has defaults set. Returns the value of the same parameter
  -- Example of: FUNCTION that takes a parameter with DEFAULT values  
  FUNCTION handle_defaults(empId IN NUMBER DEFAULT 20 , empCity IN VARCHAR2) RETURN NUMBER IS
  BEGIN
    RETURN empId;
  EXCEPTION
    WHEN others THEN
    dbms_output.put_line('Error!');
  END handle_defaults;

这是代码的相关部分(NOTE:为了可读性,已经剥离了 try catch 块、清理数据库资源等)

         // Create a database connection
         conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PWD);

         // Create a query string
         String queryStr = "{ ? = call HR.EMP_PKG.handle_defaults( ? , ? ) }";

         // Create a Callable Statements
         callStmt = conn.prepareCall(queryStr);

         // Bind values to the IN parameter
         callStmt.setString(3, "Mumbai");

         // Register OUT parameter 
         callStmt.registerOutParameter(1, java.sql.Types.NUMERIC);

         // Execute the Callable Statement
         callStmt.execute();

         // Retrieve the value of the OUT parameter
         parameterValue = callStmt.getInt(1);

         System.out.println("Value returned : " + parameterValue);

我收到以下错误:

Exception occured in the database
java.sql.SQLException: Missing IN or OUT parameter at index:: 2
Database error code: 17041

作为绝望的尝试,我还尝试为这些参数传递空值。仅包含以下行:

callStmt.setNull(2, java.sql.Types.NUMERIC);

我得到以下结果:

Value returned : 0

这是有道理的,因为setNull向参数提供 SQL Null。

我在用Oracle 11g and Oracle 12c Jdbc Driver Version 12.1.0.2.


我认为这个问题没有一个简单的答案,这不是因为 JDBC,而是因为 Oracle。

简而言之,我知道调用过程并使用参数的默认值的唯一方法是在调用过程时不指定参数。

如果你正在写

     String queryStr = "{ ? = call HR.EMP_PKG.handle_defaults( ? , ? ) }";

您总是指定这两个参数,因此您永远不能使用其中之一的默认值。如果您只想指定其中之一并使用另一个的默认值,请编写:

     String queryStr = "{ ? = call HR.EMP_PKG.handle_defaults( empCity => ? ) }";

在这种情况下,您需要在调用中指定参数名称,因为第一个参数是可选参数。如果第二个参数是可选的,则可以删除参数名称。

不幸的是,对于具有大量参数的实际过程来说,这变得相当复杂。我要做的是:

  • 使用 StringBuilder 构建过程调用字符串。
  • 运行参数,添加paramName => ?对于每个您有值的参数,它都有一部分。确保各个部分用逗号分隔。
  • 使用 StringBuilder 的输出准备 CallableStatement。
  • 再次运行参数并调用各种setString/setInt/setDate/ETC。 CallableStatement 上每个具有值的参数的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用过程默认值而不将值绑定到 Jdbc 中的参数 的相关文章

随机推荐

  • WPF 中的自动展开树视图

    有没有办法在 WPF 中自动展开树视图中的所有节点 我搜索了 甚至没有在 treeview 属性中找到展开功能 Thanks 您可以设置 ItemContainerStyle 并使用 IsExpanded 属性
  • Python - 列出文件夹中的文件 - 带变量的路径名

    我对此非常陌生 我正在使用 python 我想列出多个不同文件夹中的文件 使用 Windows 在我的第一次尝试中 我有很多路径变量 每条路径都有自己的变量 它确实有效 但这似乎是一种冗长的做法 由于除了文件夹名称之外 路径均相同 因此我尝
  • 使用包含双引号的字符串填充输入字段

    我从服务器返回一个值 其中包含双引号 我需要用值填充输入标签 我尝试过使用 escape myVariable 但这会将空格转换为 20 等 我想我可以写一个 if then 来表示如果字段中有双引号 则使用 value 但是如果字段中同时
  • 如何访问 Go 中的嵌套模块(子模块)?

    去版本 1 12 9 这是一个简单演示项目的结构 所以我们有一个模块domain 其中包含两个模块 activity and person 我想将域与主文件中的所有嵌套模块一起使用 gt 模块 go 我知道如何导入domain主要在go m
  • SciKit-Learn 的分解模块中未安装 LatentDirichletAllocation

    我在 SciKit Learn 包中遇到了一些奇怪的问题 SciKit Learn 包内有 分解 模块 其中应包含 LatentDirichletAllocation 函数 请参阅此处的文档 https scikit learn org s
  • 根据机会创建销售订单时填充自定义字段

    我在 SO 屏幕 SO301000 上创建了一个自定义字段 联系人 现在 当用户从机会屏幕 CR304000 创建销售订单时 我需要填充这些字段 新的自定义字段联系人基于在机会中选择的客户 我可以看到 当我从机会创建销售订单时 客户会自动填
  • 带 webusb 的指纹扫描仪

    可以将 USB 指纹扫描仪与 webusb 连接 配对 https wicg github io webusb https wicg github io webusb 我有数字角色 U are U 4500 想要使用react js 连接到
  • 使用 Codename One 在 WebView 上实现 WebRTC

    我正在开发一个应用程序 我需要使用 Android 的 WebView 包含 WebRTC 根据这篇文章 https developer chrome com multidevice webview overview https devel
  • 使用 JSON 响应

    执行 ajax 请求后 我从服务器收到以下响应 error false success true 我的ajax代码 ajax url update type post data this serialize success function
  • HashSet 是否与 List 相同但具有唯一性?

    我需要有能力在收藏中拥有独特的物品 我打算使用字典 这样我就可以使用 ContainsKey 方法 但我认为这会很浪费 因为我不会使用键 值对的 Value 属性 我遇到了HashSet
  • 如何使表单仅位于应用程序的最顶层?

    我正在制作 Excel 插件 其中单击菜单项或工具栏按钮 打开表单 我已将窗体的最顶层设置为 true 但它仍然是 Windows XP 的所有应用程序的最顶层 我只需要保持 Microsoft Excel 的最高位置即可 我在 Visua
  • 如何在接收端打开没有 SSHD 的 shell?

    我有一台没有 SSHD 的机器 我想从远程机器 我可以完全控制 在这台机器上打开 bash shell 由于我的有限机器上有 SSH 因此我配置了反向代理 ssh R 19999 localhost 22 remoteuser remote
  • Xcode 更改未修改的 Storyboard 和 XIB 文件

    从 git 工作流程的角度来看 当多人协作时 故事板是一种巨大的痛苦 例如 storyboard 文件中的 XML 有其起始位置
  • 如何循环遍历 Windows 窗体窗体中的所有控件或如何查找特定控件是否是容器控件?

    我会告诉我的要求 我需要有一个keydown中每个控件的事件Windows 窗体 http en wikipedia org wiki Windows Forms形式 如果我必须对所有 keydown 事件执行的操作相同 那么最好这样做 而
  • Rails 3.1 资源在服务器重新启动之前无法识别 rmagick 上传的新图像

    我有我的Rails 3 1 0应用程序运行passenger in production环境 我有一个部分 应用程序允许用户更改他的个人资料图片 因此我使用 ajax 上传器上传图像 在我的控制器中 我上传文件并使用 rmagick 为图像
  • Jquery UI 滑块 - 输入值并将滑块移动到位置

    我想知道是否有人找到了实际填充滑块的输入框并使其滑动到适当位置 onBlur 的解决方案或示例 目前 众所周知 它只是用您所在的位置更新此值在 因此 在某些方面 我试图扭转这个令人惊叹的滑块的功能 我找到的一个链接 http www web
  • 如何使 Angularjs 应用程序可抓取

    我使用 Angular js 构建单页应用程序 我的问题是如何使应用程序可爬行 因为路由是在客户端使用 ng view 处理的 而服务器只返回简单的头文件 网站链接 http india elections in http india el
  • 如何更新 Android 上的 Google Analytics 清单?

    我正在尝试禁用 Google Firebase Analytics 的自动屏 幕报告 在里面Firebase 博客文章 https firebase googleblog com 2020 08 google analytics manua
  • 制作波浪动画

    我正在尝试制作音频波动画 这段代码有什么问题 我尝试将翻译更改为比例 但没有成功 有人可以给我一些动画练习的链接吗 webkit box sizing border box box sizing border box webkit pers
  • 调用过程默认值而不将值绑定到 Jdbc 中的参数

    我正在尝试打电话PL SQL为其某些参数定义了默认值的过程 我正在这样做使用CallableStatement in JDBC 该过程有大量已定义默认值的参数 我不想在 Java 代码中显式设置默认值 这样做会使维护代码变得更加困难 如果