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

使用 JDBC 的 Oracle 临时表计数错误

邹山
2023-03-14

我有下面的DB对象和Java程序,当我尝试从Java调用Oracle的存储过程时,我无法得到临时表count.Am缺少一些东西,但我不知道wrong.Please帮助我找到错误code.When我调用的过程使用oracle语句直接在oracleSQL开发人员能够得到临时table.After每次调用插入过程它插入计数,并正确地在Oracle语句调用和Java.But当我尝试使用JDBC时,只有插入过程返回计数,但得到临时表计数缺少计数,并返回零而不是一。

温度表 :

CREATE GLOBAL TEMPORARY TABLE TABLE1_TMP(NAME VARCHAR2(10)) ON COMMIT DELETE ROWS;

程序

CREATE OR REPLACE PROCEDURE INSERT_TABLE1_TMP(IN_NAME IN VARCHAR2,TEMP_COUNT OUT NUMBER)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('IN_NAME:'||IN_NAME);
 INSERT INTO TABLE1_TMP VALUES(IN_NAME);
 SELECT COUNT(*) INTO TEMP_COUNT FROM TABLE1_TMP;
END INSERT_TABLE1_TMP;

CREATE OR REPLACE PROCEDURE GETCNT_TABLE1_TMP(TEMP_COUNT OUT NUMBER)
IS
BEGIN    
 SELECT COUNT(*) INTO TEMP_COUNT FROM TABLE1_TMP;
 DBMS_OUTPUT.PUT_LINE('COUNT:'||TEMP_COUNT);
END GETCNT_TABLE1_TMP;

执行:

DECLARE
  IN_NAME VARCHAR2(200);
  TEMP_COUNT NUMBER;
BEGIN
  IN_NAME := 'name1';

  INSERT_TABLE1_TMP(
    IN_NAME => IN_NAME,
    TEMP_COUNT => TEMP_COUNT
  );
DBMS_OUTPUT.PUT_LINE('insert TEMP_COUNT1 = ' || TEMP_COUNT);
  GETCNT_TABLE1_TMP(
    TEMP_COUNT => TEMP_COUNT
  );

DBMS_OUTPUT.PUT_LINE('TEMP_COUNT2 = ' || TEMP_COUNT);
END;

输出:

IN_NAME:name1
insert TEMP_COUNT1 = 1
COUNT:1
TEMP_COUNT2 = 1

Java方案:

Connection dbConnection = null;
CallableStatement callableStatement = null;
CallableStatement callableStatement1 = null;

try {
    dbConnection = getDBConnection();
    callableStatement = dbConnection.prepareCall("{call insert_table1_tmp(?,?)}");

    callableStatement.setString(1, "name1");        
    callableStatement.registerOutParameter(2, OracleTypes.NUMBER); 
    callableStatement.executeUpdate();          
    System.out.println("Insert into temp table count :"+callableStatement.getInt(2));

    callableStatement1 = dbConnection.prepareCall("{call  getCnt_table1_tmp(?)}");           
    callableStatement1.registerOutParameter(1, OracleTypes.NUMBER); 
    callableStatement1.execute();           
    System.out.println("Temp table count :"+callableStatement1.getInt(1));

} catch (SQLException e) {

    System.out.println(e.getMessage());

} finally {             

    if (callableStatement != null) {
        callableStatement.close();
    }
    if (callableStatement1 != null) {
        callableStatement1.close();
    }

    if (dbConnection != null) {
        dbConnection.commit();
        dbConnection.close();
    }

}

Java输出:

Insert into temp table count :1
Temp table count :0

共有1个答案

陆文斌
2023-03-14
CREATE GLOBAL TEMPORARY TABLE TABLE1_TMP(NAME VARCHAR2(10)) ON COMMIT DELETE ROWS;

根据我们的讨论,临时表在提交时删除行。如果JDBC驱动程序autocommit设置为true,那么稍后查询表时将没有行。

 类似资料:
  • 问题内容: 在Oracle中,您可以使用以下方式创建临时表: …这可能很漂亮,因为这会创建一个所有人都可以看到的表,但是一个INSERT插入表中的数据仅对他或她可见。此外,该数据将在事务或会话结束时自动删除(取决于其声明),从而使其他所有人的临时数据不受损害。 但是,在SQL Server中,可以使用以下方式创建临时表: …据我所知,它在功能和功能上与Oracle的实现有本质的不同。该临时表仅对您

  • 如果尝试执行上述查询,则会出现错误 原因:错误:933,位置:36,Sql=插入St(id)值('ADMIN');select*from Student where id in(select id from St);,OriginalSql=INSERT INTO St(id)values(“admin”);select*from Student where id in(select id fro

  • 本文向大家介绍对比Oracle临时表和SQL Server临时表的不同点,包括了对比Oracle临时表和SQL Server临时表的不同点的使用技巧和注意事项,需要的朋友参考一下 Oracle数据库创建临时表的过程以及和SQL Server临时表的不同点的对比的相关知识是本文我们主要要介绍的内容,接下来就让我们一起来了解一下这部分内容吧,希望能够对您有所帮助。 1.简介 Oracle数据库除了可以

  • 在Oracle中,需要在存储过程中多次重用查询结果。想知道临时表是推荐的方式还是其他方式... 首先,我基于某些输入参数创建一个结果集。 然后做一些检查,看看是否有任何结果集行出现在表1中。简单的连接和计数就足够了。如果算 为了获得最佳性能,应该使用临时表还是其他表? 谢谢

  • “stack_trace”:“org.springframework.jdbc.uncategorizedsqlexception:CallableStatementCallback;SQL[{call post_cycle_tfo_stat_pkg.insert_cycle_status(?,?,?,?)}]得SQLException未分类;SQL状态[99999];错误代码[17004];无效

  • 本文向大家介绍oracle 临时表详解及实例,包括了oracle 临时表详解及实例的使用技巧和注意事项,需要的朋友参考一下 在Oracle8i或以上版本中,可以创建以下两种临时表: 1。会话特有的临时表 CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> ) ON COMMIT PRESERVE ROWS;  2。事务特有的临