2010-07-05 2 views
6

ho bisogno di chiamare una stored procedure utilizzando JPA e ha trovato questo articolo:chiamata Oracle stored procedure utilizzando createNativeQuery

http://www.oracle.com/technology/pub/articles/vasiliev-jpql.html

che spiega come utilizzare EntityManager.createNativeQuery. Tuttavia, l'esempio in realtà chiama una funzione che ha un argomento di ritorno. Ho provato a cercare un esempio di chiamata a una stored procedure che non ha un ritorno, ma non è stata in grado di trovare nulla.

Posso usare createNativeQuery per chiamare una procedura? O la procedura deve essere modificata per essere una funzione (forse restituisce un esito positivo/negativo)?

Grazie!

risposta

11

Dal wiki JPA:

1.4 Stored Procedures

APP non ha alcun supporto diretto per le stored procedure. Alcuni tipi di stored procedure possono essere eseguiti in JPA tramite l'utilizzo di query native. Le query native in JPA consentono qualsiasi SQL che non restituisce nulla o restituisce un set di risultati del database da eseguire. La sintassi per eseguire una stored procedure dipende dal database. JPA non supporta le stored procedure che utilizzano i parametri OUTPUT o INOUT. Alcuni database come DB2, Sybase e SQL Server consentono alle stored procedure di restituire set di risultati. Oracle non consente di restituire set di risultati, solo i parametri OUTPUT, ma definisce un tipo CURSOR che può essere restituito come parametro OUTPUT. Oracle supporta anche funzioni memorizzate, che possono restituire un singolo valore. Una funzione memorizzata può essere normalmente eseguita utilizzando una query SQL nativa selezionando il valore della funzione dalla tabella Oracle DUAL.

Alcuni provider JPA hanno esteso il supporto per le stored procedure, alcuni supportano anche l'override di qualsiasi operazione CRUD per un'entità con una stored procedure o SQL personalizzato. Alcuni provider JPA supportano i parametri CURSOR OUTPUT.

Esempio esecuzione di una stored procedure in Oracle

EntityManager em = getEntityManager(); 
Query query = em.createNativeQuery("BEGIN VALIDATE_EMP(P_EMP_ID=>?); END;"); 
query.setParameter(1, empId); 
query.executeUpdate(); 

Quindi i miei consigli sarebbe:

  • fare qualche sperimentazioni (cioè provare)
  • se necessario (e, se possibile) modificare la stored procedure
  • considerare estensioni specifiche del provider (come ultima risorsa)
+0

Grazie Pascal per il link. Non so come ho perso quella pagina nella mia ricerca. – sdoca

1

Se è possibile, è probabile che tu bisogno di avvolgere la chiamata di procedura in questo modo:

em.createNativeQuery("BEGIN yourprocedure; END;") 

valori di ritorno di tornare possono essere problematico con le procedure. Passandoli dentro dovrebbe essere facile.