Java 使用SpringJDBC使用CLOB数据执行Oracle函数

Java 使用SpringJDBC使用CLOB数据执行Oracle函数,java,oracle,spring,clob,spring-jdbc,Java,Oracle,Spring,Clob,Spring Jdbc,我有一个oracle表 CREATE TABLE T_TEST( INFO1 VARCHAR2(2000 CHAR), INFO2 VARCHAR2(2000 CHAR), INFO CLOB) 为了向这个表中插入数据,我有一个函数返回空clob function Insert_TEST(in_infotext1 in T_TEST.info1%type := null, in_infotext2 in T_TEST.info2%type := nul

我有一个oracle表

CREATE TABLE T_TEST(
INFO1 VARCHAR2(2000 CHAR),
INFO2 VARCHAR2(2000 CHAR),
INFO CLOB)
为了向这个表中插入数据,我有一个函数返回空clob

function Insert_TEST(in_infotext1 in T_TEST.info1%type := null,
                     in_infotext2 in T_TEST.info2%type := null,)
    return T_TEST.info%type
is
    l_info T_TEST.info%type;
begin
    insert into T_TEST
            ( INFO1,
              INFO2,
              info,)
     values ( in_infotext1,
              in_infotext2,
              empty_clob())
     returning info into l_info;
     return l_info;
  end;
要调用此函数,我使用以下sql

declare
    myinfo clob;
begin
    myinfo := Insert_TEST('Info1', 'Info2');
    DBMS_LOB.OPEN(myinfo, DBMS_LOB.LOB_READWRITE);
    DBMS_LOB.WRITE(myinfo,14,1,'My Information');
    DBMS_LOB.CLOSE(myinfo);
    COMMIT;
end;
这个sql在sql开发者那里工作得非常好,但是当我尝试使用org.springframework.jdbc.core.jdbc模板执行这个sql时,我的程序进入了无限looop。 我的Java代码如下所示

OracleConnectionPoolDataSource dataSource = new OracleConnectionPoolDataSource();
        dataSource.setURL("jdbc:oracle:thin:@localhost:1521:orcl");
        dataSource.setUser("test");
        dataSource.setPassword("test");

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        String query =

                "declare "+
                "  myinfo clob;                                                           "+
                "begin                                                                    "+
                "    myinfo := Insert_TEST('Info1', 'Info2');"+
                "    DBMS_LOB.OPEN(myinfo, DBMS_LOB.LOB_READWRITE);                       "+
                "    DBMS_LOB.WRITE(myinfo,14,1,'My Information');                        "+
                "    DBMS_LOB.CLOSE(myinfo);                                              "+
                "    COMMIT;                                                              "+
                "end;";

        jdbcTemplate.execute(query);

谢谢

请在这里正确使用Spring Jdbc
您应该使用MapSqlParameterSource将参数添加到
此外,您应该使用SimpleJDBCall并使用“widthProcedureName”来设置要使用的存储过程
在我们的工作中,文本(相当于Oracle的clob)没有问题

例如,您可以查看我们的代码(通过git克隆),以ovirt engine/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java为例,了解Spring JDBC和pgsql文本类型的用法(正如我在Oracle中所说的等价于clob)。

无限循环?你怎么会这么想?我真诚地怀疑它;更可能的情况是,您有一个空的catch块,它吞下了异常,告诉您做错了什么。这里有春季课程,但春季基本上是不存在的。您一直在调用“new”。这段代码是我在try-catch块中编写的,我也在打印异常(如果发生),但控件不会进入catch块。控件永远不会返回到程序。我想程序会进入等待状态。请在调试器中尝试该控件,以确定发生了什么。就我个人而言,我看到的春天太少,甲骨文太多。您不应该调用“new”,也不应该需要Oracle数据源。调试完我的代码后,我知道关闭clob或提交时可能会出现问题,因为连接进入等待状态,并在触发sql后等待DB的响应。它对于更新查询非常有效,这意味着如果我修改我的函数并将更新查询放在位置而不是插入查询,那么它将正常工作