CREATE OR REPLACE TYPE "SEPADD"."T_NAPRAVI_NALOG_TEST" IS OBJECT
(
I_INICIJALI varchar2(3) ,
I_STATUS number(1)
)
CREATE OR REPLACE PROCEDURE "SEPADD"."GETNALOGTESTPROC"(nalog in out T_NAPRAVI_NALOG_TEST )
IS
BEGIN
nalog.I_INICIJALI := 'PC';
nalog.I_STATUS := nalog.I_STATUS + 3;
END;
public class TNapraviNalog implements SQLData{
private int I_STATUS;
private String I_INICIJALI;
private String sql_type = "T_NAPRAVI_NALOG_TEST";
public String getSQLTypeName() {
return sql_type;
}
public int getIStatus(){
return this.I_STATUS;
}
public String getIInicijali(){
return this.I_INICIJALI;
}
public void setIInicijali(String in){
I_INICIJALI = in;
}
public void setIStatus(int st){
I_STATUS = st;
}
public void readSQL(SQLInput stream, String type)
throws SQLException {
sql_type = type;
I_INICIJALI = stream.readString();
I_STATUS = stream.readInt();
}
public void writeSQL(SQLOutput stream)
throws SQLException {
stream.writeString(I_INICIJALI);
stream.writeInt(I_STATUS);
}
}
Object obj=null;
ResultSet rs=null;
CallableStatement stmt=null;
TNapraviNalog n = null;
try{
sqlQuery = "{call getnalogtestproc(?)}";
Map m = conn.getTypeMap();
m.put("sepadd.T_NAPRAVI_NALOG_TEST", Class.forName("ib.easyorm.db.TNapraviNalog"));//this maps the Java class to the Oracle custom type
conn.setTypeMap(m);
stmt=conn.prepareCall(sqlQuery);
stmt.registerOutParameter(1, Types.STRUCT, "T_NAPRAVI_NALOG_TEST");
stmt.setObject(1, paramValues.get(0) ); //paramValues.get(0) returns an instance of TNapraviNalog class
stmt.execute();
obj = stmt.getObject(1, m);
//obj = stmt.getObject(1,TNapraviNalog.class); this method is not implemented in the JDBC driver
}catch(Exception e){
throw new EasyORMException(e);
}finally{
closeResources(rs,stmt);
}
return obj;
现在,问题是,虽然我可以获得存储过程返回的结果,但该结果没有转换为Java类(TNapraviNalog),所以我必须手动执行此操作。我可以用TNapraviNalog的html" target="_blank">实例(stmt.SetObject(1,ParamValues.get(0));)成功调用Oracle过程,但无法将结果转换为TNapraviNalog。我真的很想有一个
TNapraviNalog nalog = stmt.getObject(1, m);
但是,这一行会导致异常(java.lang.ClassCastException:oracle.sql.struct不能强制转换为IB.EasyorM.db.TNAPRAVINALOG)。我猜JDBC驱动程序不知道stmt.getObject(1,m)返回的实际类型,因此无法进行转换。
有人知道这是否可以使用普通的JDBC或Hibernate来完成吗?
假设您有一个OracleCallableStatement实例ocs,它调用PL/SQL函数getEmployee。程序将员工编号传递给函数。函数返回相应的Employee对象。要检索此对象,请执行以下操作:
1.准备一个OracleCallableStatement来调用GETEMPLOYEE函数,如下所示:
OracleCallableStatement ocs = (OracleCallableStatement)conn.prepareCall("{ ? = call GETEMPLOYEE(?) }");
2.声明empnumber作为getEmployee的输入参数。将SQLData对象注册为OUT参数,类型为code OracleTypes.struct。然后,运行该语句。这可以按以下方式进行:
ocs.setInt(2, empnumber);
ocs.registerOutParameter(1, OracleTypes.STRUCT, "EMP_OBJECT");
ocs.execute();
3.使用getObject方法检索employee对象。下面的代码假设有一个类型映射条目将Oracle对象映射到Java类型Employee:
Employee emp = (Employee)ocs.getObject(1); //my comment-->this doesn't seem to work
如果没有类型映射条目,那么getObject将返回一个oracle.sql.struct对象。将输出强制转换为STRUCT类型,因为getObject方法返回泛型java.lang.Object类的实例。具体做法如下:
STRUCT emp = (STRUCT)ocs.getObject(1);
谢谢你
错误似乎在这一行:
m.put("sepadd.T_NAPRAVI_NALOG_TEST", Class.forName("ib.easyorm.db.TNapraviNalog"));//this maps the Java class to the Oracle custom type
这是您使用模式所有者限定t_napravi_nalog_test
类型的唯一一行。您可以在其他两个地方引用它,而不使用模式名称。
如果您是以sepadd
用户的身份连接到数据库(您似乎是这样),则可以从此行中删除架构所有者前缀sepadd.
。或者,尝试将上面行中的模式所有者更改为大写。
问题内容: 有人可以向我展示如何在Hibernate中编写以下SQL并正确获取结果的示例吗? 如果可能的话,我想做的就是将结果放入自己的基类中: 我相信在JPA(使用)中是可能的,但是我还没有弄清楚如何在Hibernate(使用和)中做到这一点。 我试图更好地学习Hibernate,即使这个“简单”查询也令人困惑,无法知道Hibernate以哪种形式返回结果,以及如何将结果映射到我自己的(基)类中
我需要通过连接3个不同的表来获取6列。我在entity类的顶部将它们声明为NamedNativequery,并且使用了create named query method form JPA。当我尝试fo获取结果集时,我得到的是数组对象列表,而不是POJO类型的对象列表。为了将结果集映射到外部POJO,我应该定义任何外部映射吗?
我正在尝试存储和检索一个enum类,以便稍后可以找到正确的类型(基于配置)并对其调用ValueOf来解析字符串。如何放置/获取然后调用的值? 在伪代码中,它看起来像这样: 我怎么能这样呢? 为了提供一些关于我为什么这样做的背景-我有多个这样的枚举类型,我得到一个输入,告诉我它是什么样的枚举(在文本中)和枚举中的一个值,所以我想从映射中查找枚举类,然后调用它的静态ValueOf,它将正确解析。 注意
我从一个xml模式生成java类,对于一个复杂类型,我希望jaxb使用一个现有的类,我有一个外部绑定定制文件。自定义类被解组为正确的,除了该类型的单个属性,该属性从未在java类中填充。 下面是类型/类问题的演示。 模式中定义的内容是: 读取匹配xml文件的代码段是: 在这个xml中阅读: 使用JAXB生成的Thing类(不使用自定义xjb),输出符合预期: 使用只有getters的自定义Thin
问题内容: 我有一个plsql程序 我尝试在Java代码中调用它。我已经使用其他过程执行了所有参数均为VARCHAR类型的过程,但是这里所有参数都是“ bd_tb_struct” 我也有一个带有此Comment的Java类。“数据库中对应类型的类。(bd_tb_struct)” 有人可以解释一下我该如何称呼我的程序吗? 问题答案: Oracle安装程序 : Java SQLData类 : 从Jav
我在Oracle中有一个存储过程,如下所示。 我正在从Java调用该过程。我的密码是, 即使我正在获取记录,值也是空的。这意味着如果输出为2行,则while条件执行并打印为空。在SQL Developer中,它工作得很好。提前道谢。