在 JDBC PL/SQL 块中多次使用命名参数时出错

2024-05-05

当使用命名参数调用 PL/SQL 块时出现错误,当所有命名参数仅使用一次时,我的代码工作正常,但是当我复制标有“// SQL”的 SQL 时。然后所有命名参数(以冒号开头,:q)都使用了两次,现在我得到一个 SQL 异常,它说:参数名称的数量与注册的参数数量不匹配。 似乎 JDBC 驱动程序或 DB 认为有 2 个参数,但只注册了 1 个参数?为什么我们不能多次使用命名参数?是否不需要 JDBC 驱动程序来支持这种情况? 我如何获得替代方案(除了将 PL/SQL 块重写为存储过程)?

我的 Oracle JDBC 驱动程序是最新版本 11.2.0.3.0。

因为我的项目有很多 PL/SQL 块,所以我尽力避免将 SQL 重写为存储过程,最好使用命名参数运行原始 PL/SQL 块(只需将其视为过程)。我测试了将PL/SQL块转换为存储过程,然后只导出1个参数,但我不想重写所有PL/SQL块,这需要更多的努力。

感谢您的任何提示。

我的Java代码:

CallableStatement stmt = ...;
stmt.registerOutParameter("q", Types.VARCHAR);
stmt.execute();
String v1 = stmt.getString("q");

SQL如下:

BEGIN
    select DUMMY into :q from dual where dummy = 'X';
    select DUMMY into :q from dual where dummy = 'X';
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    NULL;
END;

我刚刚发现“立即执行”可以用于我的情况,当动态 SQL 是 PL/SQL 块(用 begin 和 end 引用)时,则所有出现的事件都可以引用带有名称的命名参数。即下面附加的 SQL,在该块中,参数“q”仅使用一次, 但现在我还有另外两个问题, Q1:我不知道参数'q'是I​​N、OUT还是IN和OUT。如果我给出错误的 IN/OUT 模式,出现错误,我们如何测试参数是 IN/OUT 还是两者都有?我想扫描 SQL 中的 ':q :=' 和 'into :q',这似乎不是一个好方法。 Q2:为什么当参数'q'分配为IN OUT模式时,我无法获取它的结果?只有当它是OUT的时候,我才能得到它的值。当它都是 IN OUT 时,我得到 NULL。

begin
  execute immediate 'begin select dummy into :q from dual where :q is not null; end;'
  using in out :q;
end;

哦,当参数为 IN OUT 模式时,我得到了 NULL 的解决方法,我只是将其视为 Oracle JDBC 驱动程序的一个错误,我将命名参数“q”的 IN/OUT 角色分为两部分,第一个是 IN,第二个是OUT,使用变量来保留“using in out :q”子句返回的值,然后将变量分配给第二个角色,如下所示,在 JDBC 中我们将其视为 IN OUT,仅使用精确的 IN、OUT 或 IN扫描 ' :q := ' 和 ' into :q ' 后 USING 子句中的 OUT。

declare 
    p varchar2(100);
    q varchar2(100);
begin
    p := ?;
    q := ?;
    execute immediate 'begin if :p is null then :p := ''X''; else :p := ''Y''; :q := ''Z''; end if; end;' using in out p, out q;
    ? := p;
    ? := q;
end;

不能在 SQL 语句中多次使用同一个绑定参数。您必须为每次出现的参数提供一个值。这是因为 Oracle 忽略绑定参数名称并且只考虑冒号符号。
甲骨文文档 http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#BHCGEFCA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JDBC PL/SQL 块中多次使用命名参数时出错 的相关文章

随机推荐

  • 为什么 SuppressFormsAuthenticationRedirect 在 AuthorizeAttribute.HandleUnauthorizedRequest 覆盖中不起作用?

    我有一个 MVC 5 1 站点 其中的控制器具有单个 POST 操作 我有一个 Android 应用程序 我想使用基本身份验证发布到它 我创建了一个BasicAuthorizeAttribute类并将其应用到我的控制器 并出于测试目的使其拒
  • 如何使用 XQuery 将值列表从 XML 提取到行中?

    我有一个 XQuery 如下 DECLARE x XML SELECT x
  • Adobe Flash 项目的版本控制

    我正在处理一个非常复杂的 Flash 项目 该项目是我们为客户使用而部署的全套服务的一部分 对于我们的大多数软件源 Java PHP Javascript HTML 和一些其他语言的支持脚本 我们使用 subversion 进行版本控制和管
  • Android - 减少位图绘制的内存使用量

    我的应用程序中有一张地图 显示了 Gowalla 的位置 我使用带有简单默认标记的 ItemizedOverlay 但在绘制项目时 我将默认标记替换为从 Gowalla 下载 9 并缓存在磁盘上 的位置图标 问题是 如果屏幕上有很多位置 例
  • 查找 SSIS 包上次修改/部署日期 - SQL Server

    我想通过执行 SQL 查询找到 SSIS 包的最后修改日期 例如 下面的查询按降序返回过程的最后修改日期 我期待对 SSIS 包进行同样类型的查询 可以从DB获取这些信息吗 select name create date modify da
  • Pytest - 如何将参数传递给 setup_class?

    我有一些代码 如下所示 我得到了too few args当我运行它时出错 我没有打电话setup class明确地 所以不确定如何向它传递任何参数 我尝试用以下方法装饰该方法 classmethod 但仍然看到相同的错误 我看到的错误是这样
  • STDOUT->autoflush(1) 在 Perl 中做什么?

    我找到了有关 Perl 中自动刷新的各种信息 但找不到任何提及格式完全相同的行 STDOUT gt autoflush 1 这包含在我正在分析的程序中 我想更好地了解它的作用 程序开头还有这样一段话 use IO Handle 我认为这可能
  • 如何编辑多个 Pandas DataFrame 浮点列的字符串格式?

    我有一个pd DataFrame浮点数 import numpy as np import pandas as pd pd DataFrame np random rand 5 5 0 1 2 3 4 0 0 795329 0 125540
  • Chrome 扩展允许的键盘快捷键

    当您创建 Chrome 浏览器扩展程序时 您可以通过实现来建议键盘快捷键chrome 命令 https developer chrome com extensions commandsAPI 是否有允许的组合键的记录列表 Chrome 似乎
  • 遍历多行字符串

    我得到一些数据 def data some useless text n even more n finally interesting text 我怎样才能得到其中 有趣的部分 所以基本上所有行都不是以 开头的 Groovy 的一种选择是
  • 如何将sublime默认View设置为2行

    每次我打开 sublime 我都会执行以下操作 Layout then Rows 2 我可以更改设置 以便当我打开 sublime 时这是默认设置吗 我不知道有什么设置可以控制新创建的窗口的布局 它们始终创建为单个文件组 最好 最简单的事情
  • 是否可以从猫鼬文档中获取模型?

    var UserSchema new Schema Schema var User mongoose Model User UserSchema Model var user new User Document 仅给定文档 在本例中为用户
  • 如何使用实体框架更新特定记录的一个字段?

    我想要更新一个名叫 Pejman 的人的家庭情况 这是我的对象类 public class Person public int Id get set public string FirstName get set public string
  • 使用 CSS 更改文本选择颜色?

    我目前正在开发一个网站 我想更改文本选择颜色 我已经有点工作了 这是我的样式表中的代码 部分 selection background FF0099 color black text shadow none moz selection ba
  • 在 C、C++ 中实现腐蚀、膨胀

    我对二值图像的膨胀是如何完成的有理论上的了解 AFAIK 如果我的 SE 结构元素 是这样的 0 1 1 1 在哪里 代表中心 我的图像 二进制是这样的 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0
  • 在 SDK 中找不到文件夹“tools”

    我在做安卓开发使用 Eclipse 我已经下载了所有必需的软件 但遇到了与中讨论的相同的问题 无法在 Eclipse 中设置 Android Target https stackoverflow com questions 6384328
  • UITableView更改标题标题颜色

    我正在设计 UITableView 的样式应用内设置工具包 http InAppSettingsKit并想要更改标题的颜色 标签Without title and Text Field应该是白色的 如何才能做到这一点 Thanks 这是一个
  • 我们可以使用 axios 的 onDownloadProgress 来加载 API 吗?

    我需要使用 axios 创建一个用于在 React 项目中加载 API 的进度条 我为此发现了 onDownloadProgress 函数 但我不知道我们是否可以使用它来获取诸如加载百分比之类的信息 或者它是否仅用于文件下载 所以我不确定我
  • 如何通过 SyliusResourceBundle 使用 Sylius 创建新模型

    我找到并成功使用了有关如何覆盖 Sylius 中现有模型的文档 但我无法利用 SyliusResourceBundle 创建一个全新的模型 我猜如果你已经了解 Symfony2 的话这很容易吗 我仍在学习 所以这就是我所拥有的 我缺少什么
  • 在 JDBC PL/SQL 块中多次使用命名参数时出错

    当使用命名参数调用 PL SQL 块时出现错误 当所有命名参数仅使用一次时 我的代码工作正常 但是当我复制标有 SQL 的 SQL 时 然后所有命名参数 以冒号开头 q 都使用了两次 现在我得到一个 SQL 异常 它说 参数名称的数量与注册