-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 10 posts ] 
Author Message
 Post subject: Wie rufe ich eine Stored Procedure unter Oracle auf?
PostPosted: Sun Dec 04, 2005 2:59 pm 
Newbie

Joined: Wed Sep 28, 2005 5:17 pm
Posts: 12
Hibernate version: 3.0.5

Mapping documents:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="net.allschools.hbn.manual.Band" table="BAND">
<id name="id" column="ID" type="integer">
<generator class="increment">
</generator>
</id>
<property name="name" column="NAME" type="string" not-null="true"/>

<set name="releases" table="RELEASE_BANDS" lazy="true">
<key column="BAND_ID"/>
<many-to-many class="net.allschools.hbn.manual.Release" column="RELEASE_ID"/>
</set>

<sql-insert callable="true">{call bandAnlegen(?,?)}</sql-insert>

</class>
</hibernate-mapping>




Code between sessionFactory.openSession() and session.close():

// Neue Band
Band band = new Band();

band.setId(35);
band.setName("Testband");

session.save(band);



Full stack trace of any exception that occurs:
Hibernate: {call bandAnlegen(?,?)}
19:55:46,281 WARN util.JDBCExceptionReporter SQL Error: 6502, SQLState: 65000
19:55:46,281 ERROR util.JDBCExceptionReporter ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 1

19:55:46,296 ERROR def.AbstractFlushingEventListener Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: could not insert: [net.allschools.hbn.manual.Band]


Name and version of the database you are using: Oracle 10g

--------------------------


Hallo.
Ich beschäftige mich für mein Studium mit Hibernate. Da ich einige Features präsentieren soll, wollte ich auch testen, inwieweit Stored Procedures unter Oracle aufgerufen werden können.

Leider habe ich bei obigem Aufruf immer Fehler. Probiere nun schon seit Stunden.

Ist dieser Aufruf hier überhaupt richtig?
Code:
// Neue Band
            Band band = new Band();
           
            band.setId(35);
            band.setName("Testband");
                       
            session.save(band);


Und auch das hier: Ist das so richtig?

Code:
<sql-insert callable="true">{call bandAnlegen(?,?)}</sql-insert>


Oder wie kann ich normalerweise of Stored Procedures durchgreifen?

Die Procedure ist angelegt und funktioniert auch, wenn ich sie direkt über das Oracle-Frontend aufrufe.

Wäre schön, wenn jemand hier wäre, der mir helfen kann.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 05, 2005 4:56 pm 
Expert
Expert

Joined: Tue Dec 07, 2004 6:57 am
Posts: 285
Location: Nürnberg, Germany
Hi,
der Code kommt mir ja irgendwie von meinem Java Magazin Artikel bekannt vor ;-)

Kannst Du mal die Procedure noch posten.

Ciao,
Michael


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 05, 2005 4:59 pm 
Expert
Expert

Joined: Tue Dec 07, 2004 6:57 am
Posts: 285
Location: Nürnberg, Germany
und noch ein kleiner tip zum lesen:
http://www.hibernate.org/hib_docs/v3/re ... erysql-cud


Top
 Profile  
 
 Post subject: Quelltext
PostPosted: Mon Dec 05, 2005 5:35 pm 
Newbie

Joined: Wed Sep 28, 2005 5:17 pm
Posts: 12
Hallo.

Ja das ist das Beispiel aus dem Java-Magazin. :-) Hier der Code meiner Procedure:


Code:
create or replace procedure bandAnlegen
(uid band.id%type,
uname band.name%type
)
is
begin
     insert into band(id, name) values (uid, uname);
     
 
end bandAnlegen;



Vielen Dank.

Gruß
Christoph


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 05, 2005 5:53 pm 
Expert
Expert

Joined: Tue Dec 07, 2004 6:57 am
Posts: 285
Location: Nürnberg, Germany
welchen typ besitzen band und id?


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 05, 2005 6:03 pm 
Newbie

Joined: Wed Sep 28, 2005 5:17 pm
Posts: 12
ID hat den Typ Integer

NAME ist VARCHAR2(255)





ID ist der primary key, NAME ist als NOT NULL angelegt


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 05, 2005 6:58 pm 
Newbie

Joined: Wed Sep 28, 2005 5:17 pm
Posts: 12
Habe gerade noch herausgefunden, dass man Hibernate dazubringen kann, dass es noch mehr "redet". :-)

Code:
23:52:39,453 DEBUG Printer:83 - listing entities:
23:52:39,453 DEBUG Printer:90 - net.allschools.hbn.manual.Band{releases=null, name=Testband, id=37}
23:52:39,453 DEBUG AbstractFlushingEventListener:267 - executing flush
23:52:39,453 DEBUG BasicEntityPersister:1825 - Inserting entity: [net.allschools.hbn.manual.Band#37]
23:52:39,453 DEBUG AbstractBatcher:290 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
23:52:39,468 DEBUG SQL:324 - {call bandAnlegen(?,?)}
Hibernate: {call bandAnlegen(?,?)}
23:52:39,468 DEBUG AbstractBatcher:348 - preparing callable statement
23:52:39,484 DEBUG BasicEntityPersister:1612 - Dehydrating entity: [net.allschools.hbn.manual.Band#37]
23:52:39,484 DEBUG StringType:59 - binding 'Testband' to parameter: 1
23:52:39,484 DEBUG IntegerType:59 - binding '37' to parameter: 2
23:52:39,671 DEBUG AbstractBatcher:298 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
23:52:39,671 DEBUG AbstractBatcher:416 - closing statement
23:52:39,687 DEBUG JDBCExceptionReporter:63 - could not insert: [net.allschools.hbn.manual.Band] [{call bandAnlegen(?,?)}]
java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 1



Auf jeden Fall werden die Parameter ja übergeben:

23:52:39,484 DEBUG StringType:59 - binding 'Testband' to parameter: 1
23:52:39,484 DEBUG IntegerType:59 - binding '37' to parameter: 2

Allerdings habe ich festgestellt, dass diese Zuordnung zu den Parametern immer gleich ist, egal wie ich die Procedure definiere, also bei

Code:
insert into band(name, id) values (uname, uid);


siehts genauso aus wie bei:

Code:
insert into band(id, name) values (uid, uname);


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 05, 2005 7:08 pm 
Expert
Expert

Joined: Tue Dec 07, 2004 6:57 am
Posts: 285
Location: Nürnberg, Germany
Ausschnitt aus der doku...

Quote:
The order of the positional parameters are currently vital, as they must be in the same sequence as Hibernate expects them.

You can see the expected order by enabling debug logging for the org.hiberante.persister.entity level. With this level enabled Hibernate will print out the static SQL that is used to create, update, delete etc. entities. To see the expected sequence, remember to not include your custom SQL in the mapping files as that will override the Hibernate generated static sql.



-> änder mal die param reihenfolge in der procedure..


Top
 Profile  
 
 Post subject:
PostPosted: Tue Dec 06, 2005 2:50 am 
Newbie

Joined: Wed Sep 28, 2005 5:17 pm
Posts: 12
So funktionierts. Diese Idee mit dem Parametertausch ist mir gestern abend, als ich im Bett lag, auch noch eingefallen.

Hab den Teil der Doku zwar gelesen aber stand doch irgendwie auf dem Schlauch.


Vielen Dank für deine Hilfe !!!


Top
 Profile  
 
 Post subject:
PostPosted: Tue Dec 06, 2005 4:02 am 
Expert
Expert

Joined: Tue Dec 07, 2004 6:57 am
Posts: 285
Location: Nürnberg, Germany
Bitte, kein Problem... viel Glück bei der Präsentation


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 10 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.