当前位置: 首页 > 面试题库 >

在Java中执行匿名pl / sql块并获取结果集

韩彦君
2023-03-14
问题内容

我想执行匿名PL / SQL,并需要获取结果集对象。我得到了可以通过使用PL / SQL块内的游标完成的代码。

但是PL / SQL块本身将以文本形式来自数据库。因此,我无法编辑该PL / SQL块。并且它将仅返回两个其列名始终相同的值。它将返回2个列组合值的列表。

在这里,我给出示例PL / SQL。

BEGIN

RETURN 'select distinct fundname d, fundname r from <table> where condition order by 1';

EXCEPTION
   WHEN OTHERS THEN
    RETURN 'SELECT ''Not Available'' d, ''Not Available'' r FROM dual';
END;

任何回复都将非常有帮助。


问题答案:

这是一个如何“执行匿名PL / SQL并获取结果集对象”的独立示例。

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Types;

import oracle.jdbc.OracleTypes;

public class CallPLSQLBlockWithOneInputStringAndOneOutputStringParameterAndOneOutputCursorParameter {

    public static void main(String[] args) throws Exception {

        DriverManager.registerDriver(new oracle.jdbc.OracleDriver());

        // Warning: this is a simple example program : In a long running application,
        // error handlers MUST clean up connections statements and result sets.

        final Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "manager");
        String plsql = "" +
        " declare " +  
        "    p_id varchar2(20) := null; " +
        "    l_rc sys_refcursor;" +
        " begin " +
        "    p_id := ?; " +
        "    ? := 'input parameter was = ' || p_id;" +
        "    open l_rc for " +
        "        select 1 id, 'hello' name from dual " +
        "        union " +
        "        select 2, 'peter' from dual; " +
        "    ? := l_rc;" +
        " end;";

        CallableStatement cs = c.prepareCall(plsql);
        cs.setString(1, "12345");
        cs.registerOutParameter(2, Types.VARCHAR);
        cs.registerOutParameter(3, OracleTypes.CURSOR);

        cs.execute();

        System.out.println("Result = " + cs.getObject(2));

        ResultSet cursorResultSet = (ResultSet) cs.getObject(3);
        while (cursorResultSet.next ())
        {
            System.out.println (cursorResultSet.getInt(1) + " " + cursorResultSet.getString(2));
        } 
        cs.close();
        c.close();
    }
}

上面的示例查询“从double联合中选择1 id,’hello’名称,从double选择2,’peter’;可以用任何查询代替。



 类似资料:
  • 我正在使用SQLDeveloper中的一段代码进行考试,但我在代码上遇到了问题。显示的错误是 ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小 我使用的代码是这样的: 我做错了什么?另外,我必须让这个块运行三次,每次都必须输入不同的RUT_CLIENTE(相当于智利的社会安全号码)以显示不同的结果,所以我应该为此使用循环吗?

  • 问题内容: 我在检索Java中匿名PLSQL块的结果时遇到了一些麻烦。 这是块: 我把查询放在一个字符串中: 那字符串正确吗? 尝试检索的方法: 当我收到此消息时,它不起作用: 那我该如何找回呢? 问题答案: 这是因为 隐式 日期转换失败。添加而不是直接将日期字符串分配给日期变量。如果使用,则不需要。 隐式转换通常取决于会话的。 您的罪魁祸首。实际上将尝试转换为日期。因此引发了异常! 然后, 将设

  • 问题内容: 我有一个像这样构造的PL / SQL查询: 如何使用jdbc从Java代码运行此查询并获取结果集?我尝试不使用游标来运行查询,并且其运行正常。我想不出一种在Java代码中执行此操作的方法。如果我直接将查询运行到oracle客户端上,它将正常工作。因此查询没有问题。 PS我不想将代码存储为存储过程,并由于某些限制而调用它。 问题答案: 这是不可能的。您无法从匿名PL / SQL块返回结果

  • 问题内容: 我在Oracle数据库11g中使用Pl / SQL。 我正在编写一个将select语句作为参数(varchar2)的函数。该函数使用for循环遍历行并将格式应用于特定的列,并输出整个内容。基本上,我需要某种方式来获取列名,以便可以在顶部显示它们。我知道有多种方法可以对表执行此操作,但是由于传入了此查询,因此可能未选择所有列,可能已使用别名等。 有没有一种方法可以从此查询中选择列名? 理

  • 我需要迭代resultset中返回的数百万条记录,并对它们进行处理,然后将它们存储在某些数据结构中。我没有找到任何相关的例子或参考。JOOQ似乎在做一些我可能想要的事情,但它似乎不是免费的。我希望,如果使用Java8流,我可能能够实现它,但示例或writeup似乎没有给我任何方向。我也愿意接受其他选择 基于这个SO参考:resultset parallel,我在下面进行了尝试,但它没有给我任何性能

  • 问题内容: 在Java中,如何从返回数组的函数中获取值。 如果我的pl / sql函数返回名为的数组,那么在Java中是否可以使用从中获取值到Java对象中? 谢谢 更新1 我正在调用函数的Java代码,但是却遇到异常。 更新2 和 功能 固定更新3 问题答案: 我没有这样做,但应该可以。首先,您必须注册函数的参数。这样就可以这样。 试试这个男人,然后给我,问是否做。 编辑: 这些字符 ? 表示您