- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我有一个调用存储过程的方法,但我收到下一个错误:
“GRAVE [cl.auter.sictrav.daos.sictrav.ControladorDao](MSC 服务线程 1-1)java.sql.SQLException:ORA-08103:对象不再存在:java.sql.SQLException:ORA-08103:对象不再存在”
引用这一行 ResultSet rs = (ResultSet)cStmt.getObject(3);
我的代码是
public List obtenerBitsEstadoDao(Controlador controlador) {
DBSictrav conn = new DBSictrav();
List bitsestado = new ArrayList();
Connection connection = null;
try {
connection = conn.getConection("");
String query = "{ call pkg_plan_sic.pg_obt_bit_est_crc_ctl(?,?,?,?,?)}";
try (CallableStatement cStmt = connection.prepareCall(query)) {
cStmt.setString(1, "CT");
cStmt.setInt(2, controlador.getId());
cStmt.registerOutParameter(3, OracleTypes.CURSOR);
cStmt.registerOutParameter(4, OracleTypes.NUMBER);
cStmt.registerOutParameter(5, OracleTypes.VARCHAR);
cStmt.executeQuery();
if (cStmt.getInt(4) == 0) {
try
{
ResultSet rs = (ResultSet)cStmt.getObject(3);
while (rs.next()) {
BitEstado bc = new BitEstado(rs.getString("BIT_CRUCE"));
bc.setFaseReal(rs.getString("BIT_CONTROLADOR"));
bc.setPosicion(rs.getInt("POSICION"));
bc.setControlador(controlador);
bitsestado.add(bc);
}
} catch (Exception e) {
logger.log(Level.SEVERE, e.toString(), e);
}
}
else
{
throw new SictravDaoException((String) cStmt.getObject(5), cStmt.getInt(4));
}
} catch (Exception e) {
logger.log(Level.SEVERE, e.toString(), e);
}
} catch (Exception e) {
logger.log(Level.SEVERE, e.toString(), e);
} finally {
try {
connection.close();
} catch (SQLException ex) {
Logger.getLogger(PlanDao.class.getName()).log(Level.SEVERE, null, ex);
}
}
return bitsestado;
}
存储过程
procedure pg_obt_bit_crc_ctl(
p_tipo in varchar2,
p_id in number,
p_cur_lis out cur_ref,
p_cod_err out number,
p_des_err out varchar2) is
--
v_string varchar2(32000);
v_ind_whe boolean := false;
v_num_lin varchar2(10);
--
cursor bit_por_cr is
select distinct c.id_cruce,
t.id_masccontrol,
16 - instr(dec2bin(bit00), '1') + 1 F1
c.codigo codigo
from tbl_mascara_control m,
tbl_controlador t,
tbl_cruce c
where m.id_masccontrol = t.id_masccontrol
and c.id_controlador = t.id_controlador
and c.id_cruce = p_id;
--
cursor bit_por_ct is
select t.id_controlador id_cruce,
t.id_masccontrol,
16 - instr(dec2bin(bit00), '1') + 1 F1,
16-instr(dec2bin(bit08),'1')+1 RR
//more similar lines
from tbl_mascara_control m,
tbl_controlador t
where m.id_masccontrol = t.id_masccontrol
and t.id_controlador = p_id;
--
v_fase_ini number;
v_num_ctl number;
v_num_fase number;
v_ind_fase_check number;
posIni number;
posFin number;
v_idx_pal number;
v_cnt number;
v_num_paralelo number;
--
begin
-->Borramos los datos de la tabla temporal orientada a la transaccion...
commit;
--
if p_tipo = 'CT' then
--
for c in bit_por_ct loop
if (c.f1 is not null) then
insert into tbl_tmp_bits_cruce(id_cruce, bit_cruce, bit_controlador, posicion) values(c.id_cruce, 'F1', 'F1', c.F1);
end if;
//More similar lines ...
if (c.PR1 is not null) then
insert into tbl_tmp_bits_cruce(id_cruce, bit_cruce, bit_controlador, posicion) values(c.id_cruce, 'PR1', 'PR1', c.PR1);
end if;
if (c.PR2 is not null) then
insert into tbl_tmp_bits_cruce(id_cruce, bit_cruce, bit_controlador, posicion) values(c.id_cruce, 'PR2', 'PR2', c.PR2);
end if;
if (c.PR3 is not null) then
insert into tbl_tmp_bits_cruce(id_cruce, bit_cruce, bit_controlador, posicion) values(c.id_cruce, 'PR3', 'PR3', c.PR3);
end if;
if (c.PR4 is not null) then
insert into tbl_tmp_bits_cruce(id_cruce, bit_cruce, bit_controlador, posicion) values(c.id_cruce, 'PR4', 'PR4', c.PR4);
end if;
--
if (c.RR is not null) then
insert into tbl_tmp_bits_cruce(id_cruce, bit_cruce, bit_controlador, posicion) values(c.id_cruce, 'RR', 'RR', c.RR);
end if;
--
// More similar ifs
--
end loop;
end if;
--
open p_cur_lis for
select b.id_cruce, b.bit_cruce, b.bit_controlador, b.posicion,c.codigo
from tbl_tmp_bits_cruce b,tbl_cruce c
where b.id_cruce=c.id_cruce(+)
order by b.posicion ;
--
--> ahora recorremos el cursor...
v_num_lin := '60';
p_cod_err := 0;
p_des_err := '';
--
exception
when others then
p_cod_err := -20000;
p_des_err := 'Error al obtener Bits por cruce o controlador';
end pg_obt_bit_crc_ctl;
我收到此错误,但不知道原因或如何修复它。我尝试使用 ojdbc6 和 ojdbc14 相同的结果。有什么建议吗?
最佳答案
问题是存储过程返回的游标仅在 SP 本身运行的同一事务中有效。如果您的连接在自动提交模式下运行,则该事务会在 executeQuery()
方法返回之前结束。其他类型的输出参数在事务结束后仍然存在,但游标不再有效。
您可以通过手动控制事务边界来解决此问题。为此,您必须确保连接不处于自动提交模式,并且您必须确保在方法返回之前手动提交事务或将其回滚。概要如下:
try {
Connection connection = conn.getConnection();
try {
CallableStatement cStmt;
connection.setAutoCommit(false);
cStmt = connection.prepareCall(query);
// ... register parameters ...
try {
cStmt.executeQuery();
// ... extract and process SP out parameters ...
connection.commit();
} catch (Exception e) {
connection.rollback();
// ... other handling ...
}
} finally {
connection.close();
}
} catch (SQLException e) {
// handle it ...
}
此外,在完全防御模式下编程将要求在返回之前恢复原始连接自动提交状态,以避免干扰数据源管理的底层 Connection
的其他使用。我没有在上面进行建模,因为数据源不应该需要它,但这将是对 DS 中当前或 future 可能出现的错误的防御。
关于Java.sql.SQLException : ORA-08103: object no longer exists cursor in stored procedure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36867280/
我在 SQL 查询中使用了一个简单的 IF NOT EXISTS/WHERE NOT EXISTS 语句(我都尝试过),但我总是收到 mysql 错误,不知道为什么。尝试使用不同的引号,检查我的 My
我有 2 个表:tbl1 和 tbl2。我想从 tbl1 返回一行,其中包含以下列:col1、col2、col3、can_be_deleted 、有重要项目。这个想法是,can_be_deleted
如果您是 "t1".persona_1_id = 2,则预期结果应返回 persona_id = 4。 like --- id persona_1_id persona_2_id liked 1 2
我遇到了这个用于执行幂等插入的 github SQL 代码示例。完全按照我想要的方式工作。我不想使用 EXISTS,因为我觉得它有点困惑。可以使用联接对相同的操作进行编码吗? 下面是我在 github
public bool CheckTblExist(string TblName) { try { string cmTxt = "s
表1 Id Name DemoID 1 a 33 2 b 44 3 c 33 4 d 33 5 e 44 表2 Id DemoID IsT
我对 SQL 非常陌生。我想知道当我使用“IF EXISTS”或“IF NOT EXISTS”时会发生什么。例如:以下两个语句有什么区别: 语句 1:(存在) IF EXISTS( SELECT OR
我正在更新 exist-db 集合中的 XML 文件,我必须检查是否存在 id 以决定是否必须在我的文档中替换或插入某些内容。 我注意到随着文件的增长,查询执行时间显着恶化,我决定为我的文件添加一个索
我有一个正在尝试更新的数据库,但我不明白为什么会收到有关不存在的列的奇怪错误。当我使用“heroku pg:psql”访问数据库时,我完全可以看到该列。我找到了couple其他questions遇到类
我有一个这样的查询 SELECT ... FROM ... WHERE (SELECT EXISTS (SELECT...)) which did not return anything th
我有一个可以对数据库执行插入和更新的程序,我从 API 获取数据。这是我得到的示例数据: $uname = $get['userName']; $oname = $get['offerNa
我的批处理文件中有这个脚本 -- if not exist "%JAVA_HOME%" ( echo JAVA_HOME '%JAVA_HOME%' path doesn't exist) -
有没有办法让 Directory.Exists/File.Existssince 区分大小写 Directory.Exists(folderPath) 和 Directory.Exists(folde
考虑使用这两个表和以下查询: SELECT Product. * FROM Product WHERE EXISTS ( SELECT * FROM Codes
我正在使用 Subclipse 1.6.18 使用 Eclipse 3.72 (Indigo) 来处理 SVN 1.6 存储库。这一切都在 Ubuntu 下运行。 我有一个项目,在我更新我的 Ecli
我正在尝试使用 Terraform 配置 Azure 存储帐户和文件共享: resource "random_pet" "prefix" {} provider "azurerm" { versi
我有兴趣为需要使用 NOT EXISTS 的应用程序编写查询。子句来检查一行是否存在。 我正在使用 Sybase,但我想知道一般 SQL 中是否有一个示例,您可以在其中编写具有 NOT EXISTS
我正在尝试使用 Terraform 配置 Azure 存储帐户和文件共享: resource "random_pet" "prefix" {} provider "azurerm" { versi
下面是代码示例: CREATE TABLE #titles( title_id varchar(20), title varchar(80)
我曾经这样编写 EXISTS 检查: IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters) BEGIN UPDATE TABLE SET
我是一名优秀的程序员,十分优秀!