-1

私は次のようなOracleテーブルを持っています

CREATE TABLE T_TEST(
INFO1 VARCHAR2(2000 CHAR),
INFO2 VARCHAR2(2000 CHAR),
INFO CLOB)

このテーブルにデータを挿入するために、空のCLOBを返す関数が1つあります。

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はSQLDeveloperから完全に機能しますが、org.springframework.jdbc.core.JdbcTemplateを使用してこのSQLを実行しようとすると、プログラムが無限にループします。私の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);

ありがとう

4

1 に答える 1

0

ここでSpringJdbcを適切に使用してください。
パラメータをに追加するには、useMapSqlParameterSourceを使用する必要があります。
さらに、ストアドプロシージャを操作するように設定するには、SimpleJdbcCallを使用し、「widthProcedureName」を使用する必要があります。 oVirt
では、テキスト(Oracleのclobに相当するpgsql)を問題なく処理します。 たとえば、コードを(git clonningによって)見ることができます-ovirt-engine / backend / manager / modules / dal / src / main / java / org / ovirt / engine / core / dao / AsyncTaskDAODbFacadeImpl.java Spring JDBCとpgsqlテキストタイプの使用例として(これは、Oracleのclobと同等です)。

于 2012-07-03T06:07:21.673 に答える