当前位置: 首页 > 知识库问答 >
问题:

如何在Java中执行Oracle PLSQL块

邢硕
2023-03-14

我有这样一个PL/SQL块:

BEGIN
  FOR i IN 1..100
  LOOP
    UPDATE rptbody 
       SET comments = 'abcs';
     WHERE (rptno> 100 and rptno < 200) and ROWNUM<2;
    COMMIT;
  END LOOP;
END;

此块需要使用Oracle JDBC执行。我尝试过以下方法:

>

  • 尝试使用语句对象执行此操作。因为这是一个块,所以出现了一个异常,说这不是一个sql语句

    这可以分成sql语句,但是我有100个这样的块,这对代码来说很麻烦,我想把这个留给sqlplus。

    尝试使用Callable语句,但不能正常工作。

    任何解决方案都会有帮助。

  • 共有3个答案

    党浩阔
    2023-03-14

    试图使用语句对象执行此操作。由于这是一个块,因此引发了一个异常,表示这不是sql语句

    Since you were trying to execute a plsql block, you should not use Statement object. 
    

    从…起https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html:用于执行静态SQL语句并返回其生成的结果的对象。

    这是执行块所需的方式:

    CallableStatement anonBlock = null // Note that CallableStatement is an interface
    
    String anonBlockString = '' //Generally multi line
    // Set in and out parameters as needed by your anonBlockString
    
    anonBlock.registerOutParameter( <number> , <type> )
    
    ...
    
    // executeUpdate() is inherited from PreparedStatement and can be used for executing DML statements (update, insert, delete)
    anonBlock.executeUpdate(); 
    
    
    To access out parameters:
    anonBlock.getString(<number which you have assigned in registerOutParameter() calls);
    

    完整示例:(https://download.oracle.com/otn_hosted_doc/timesten/1121/quickstart/sample_code/jdbc/plsqlJDBC.java)

    这可以分成sql语句,但是我有100个这样的块,这对代码来说很麻烦,我想把这个留给sqlplus。

    更喜欢使用存储过程而不是匿名块。由于存储过程是以编译和优化的格式存储的,因此与匿名存储过程相比,它们的性能有所提高

    尝试使用CallableStatement,但效果不佳:

    代码是什么,错误/堆栈?

    傅越
    2023-03-14

    查看一些代码示例,在Github上使用CallableStatement和PreparedStatement

    赏开宇
    2023-03-14

    这与你如何经营无关。PL/SQL语法无效。在更新子句之后,在WHERE子句之前有一个

    BEGIN
      FOR i IN 1..100
      LOOP
        UPDATE rptbody 
           SET comments = 'abcs' --<<< no semicolon here!!
         WHERE (rptno> 100 and rptno < 200) and ROWNUM<2;
        COMMIT;
      END LOOP;
    END;
    

    上述代码可以如下方式运行:

    String sql = "... the PL/SQL block ...";
    Statement stmt = connection.createStatement();
    stmt.execute(sql);
    
     类似资料:
    • 问题内容: 我使用Java中的以下代码使用HMAC-SHA1哈希一些值: 属于 在PHP中,有一个类似的函数可用来比较Java实现返回的值。 因此,首先尝试是: 返回: 我的Java函数也会返回。 好的,看来可行。然后,我尝试使用一个更复杂的键: 返回: 这次,我的Java展示返回了: 我的PHP代码返回的哈希值不等于我的Java函数返回的值,而且我找不到原因。 有小费吗? 问题答案: 在您的PH

    • 问题内容: 我想使用Java程序将avi文件转换为3gp。 为此,我使用“ EM Total Video Converter命令行2.43”,其命令为 “ C:\ EM TVCC > TVCC -f E:\ TestVideo \ 01.avi -o E:\ OutputFiles \ target.3gp” 我在站点http://www.rgagnon.com/javadetails/java-

    • 问题内容: 我需要在Java字符串之间执行Diffs。我希望能够使用原始的string和diff版本重建字符串。有人用Java完成吗?你使用什么图书馆? 问题答案: 这个库似乎可以解决问题:google-diff-match-patch。它可以根据差异创建补丁字符串,并允许重新应用补丁。

    • 问题内容: 我有一个使用PHP(Joomla)实现的系统。现在,客户希望集成一个SMS网关。不幸的是,SMS网关不支持PHP。它用Java编写,所有示例都用JAVA编写。 我应该将其包含在程序中并运行以下示例脚本。 据我所知,我可以使用PHP如下运行 如何在PHP中运行上述Java脚本?可能吗?有没有办法桥接PHP和JAVA?我想要的是在PHP中运行JAVA,否则我会说这两者之间进行通信。 问题答

    • 问题内容: 我如何在Java URLConnection中实现以下curl命令 提前致谢 问题答案: 使用URLConnection的派生类(即HttpURLConnection),您可以轻松地做到这一点。 对于

    • 问题内容: 我想问一下如何多次执行1条命令 例如此代码 我要运行500次,该怎么办? 谢谢 问候威廉姆斯 问题答案: 使用循环, 请阅读基本的Java教程。可以在这里找到一个