วิธีการเรียกเก็บโพรซีเดอร์จาก Java และ JPA


95

ฉันกำลังเขียนเว็บแอปพลิเคชันง่ายๆเพื่อเรียกขั้นตอนการจัดเก็บและดึงข้อมูลบางอย่าง มันเป็นแอปพลิเคชั่นที่ง่ายมากซึ่งโต้ตอบกับฐานข้อมูลของลูกค้า เราส่งรหัสพนักงานและรหัส บริษัท และขั้นตอนที่จัดเก็บจะส่งกลับรายละเอียดพนักงาน

เว็บแอปพลิเคชันไม่สามารถอัปเดต / ลบข้อมูลและกำลังใช้ SQL Server

ฉันกำลังปรับใช้เว็บแอปพลิเคชันของฉันใน Jboss AS ฉันควรใช้ JPA เพื่อเข้าถึงโพรซีเดอร์ที่เก็บไว้หรือCallableStatement. ข้อได้เปรียบของการใช้ JPA ในกรณีนี้

นอกจากนี้คำสั่ง sql จะเรียกโพรซีเดอร์ที่เก็บไว้นี้คืออะไร ฉันไม่เคยใช้ขั้นตอนการจัดเก็บมาก่อนและฉันกำลังดิ้นรนกับขั้นตอนนี้ Google ไม่ได้ให้ความช่วยเหลือมากนัก

นี่คือขั้นตอนการจัดเก็บ:

CREATE procedure getEmployeeDetails (@employeeId int, @companyId int)
as
begin
    select firstName, 
           lastName, 
           gender, 
           address
      from employee et
     where et.employeeId = @employeeId
       and et.companyId = @companyId
end

อัปเดต:

สำหรับคนอื่นมีปัญหาโทรเก็บขั้นตอนการใช้JPA

Query query = em.createNativeQuery("{call getEmployeeDetails(?,?)}",
                                   EmployeeDetails.class)           
                                   .setParameter(1, employeeId)
                                   .setParameter(2, companyId);

List<EmployeeDetails> result = query.getResultList();

สิ่งที่ฉันสังเกตเห็น:

  1. ชื่อพารามิเตอร์ใช้ไม่ได้สำหรับฉันดังนั้นลองใช้ดัชนีพารามิเตอร์
  2. แก้ไขคำสั่ง sql {call sp_name(?,?)}แทน call sp_name(?,?)
  3. หากกระบวนงานที่จัดเก็บส่งคืนชุดผลลัพธ์แม้ว่าคุณจะทราบด้วยแถวเดียว แต่ก็getSingleResultไม่ได้ผล
  4. ส่งresultSetMappingชื่อหรือรายละเอียดคลาสผลลัพธ์

2
คุณไม่สามารถใช้ชื่อพารามิเตอร์ในพื้นเมืองคำสั่ง พารามิเตอร์ที่ตั้งชื่อได้รับการสนับสนุนสำหรับแบบสอบถาม JPQL เท่านั้น (หากคุณต้องการพารามิเตอร์ที่มีชื่อคุณสามารถเขียนคลาสของคุณเองเพื่อแปลชื่อเป็นพารามิเตอร์ที่มีหมายเลข)
วิเลียมเบอร์

ฉันใช้พารามิเตอร์ที่ตั้งชื่อกับ createNativeQueries มาโดยตลอดและไม่เคยมีปัญหาใด ๆ ฉันเพิ่งดูระบบปัจจุบันที่ฉันใช้งานอยู่และมีแบบสอบถามเนทีฟมากมายพร้อมพารามิเตอร์ที่ตั้งชื่อ คุณสามารถให้ข้อมูลอ้างอิงสำหรับการยืนยันของคุณได้หรือไม่? ชุดของเราคือ JPA 2 และ Hibernate 4+
Jaumzera

คำตอบ:


59

JPA 2.1 ในขณะนี้สนับสนุนขั้นตอนการเก็บอ่าน doc Java ที่นี่

ตัวอย่าง:

StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("sales_tax");
// set parameters
storedProcedure.registerStoredProcedureParameter("subtotal", Double.class, ParameterMode.IN);
storedProcedure.registerStoredProcedureParameter("tax", Double.class, ParameterMode.OUT);
storedProcedure.setParameter("subtotal", 1f);
// execute SP
storedProcedure.execute();
// get result
Double tax = (Double)storedProcedure.getOutputParameterValue("tax");

ดูตัวอย่างรายละเอียดที่นี่


23

ฉันกำลังปรับใช้เว็บแอปพลิเคชันของฉันใน Jboss AS ฉันควรใช้ JPA เพื่อเข้าถึงโพรซีเดอร์ที่เก็บไว้หรือ CallableStatement ข้อดีของการใช้ JPA ในกรณีนี้

มันไม่ได้รับการสนับสนุนจริงๆโดย JPA แต่มันก็เป็นไปได้ ฉันจะไม่ไปทางนี้:

  • การใช้ JPA เพียงเพื่อแมปผลลัพธ์ของการเรียกโพรซีเดอร์ที่เก็บไว้ในถั่วบางชนิดนั้นมากเกินไป
  • โดยเฉพาะอย่างยิ่งเนื่องจาก JPA ไม่เหมาะสมที่จะเรียกขั้นตอนการจัดเก็บ (ไวยากรณ์จะค่อนข้างละเอียด)

ดังนั้นฉันจึงอยากพิจารณาใช้การสนับสนุน Spring สำหรับการเข้าถึงข้อมูล JDBCหรือตัวทำแผนที่ข้อมูลเช่นMyBatisหรือเนื่องจากความเรียบง่ายของแอปพลิเคชันของคุณ JDBC ดิบและCallableStatement. จริงๆแล้ว JDBC น่าจะเป็นตัวเลือกของฉัน นี่คือตัวอย่างการเริ่มต้นพื้นฐาน:

CallableStatement cstmt = con.prepareCall("{call getEmployeeDetails(?, ?)}");
cstmt.setInt("employeeId", 123);
cstmt.setInt("companyId", 456);
ResultSet rs = cstmt.executeQuery();

ข้อมูลอ้างอิง


ตามที่ระบุไว้ในคำตอบด้านล่างนี้ได้รับการสนับสนุน - คุณอาจต้องการแก้ไข
Mr_and_Mrs_D

10

คุณต้องส่งผ่านพารามิเตอร์ไปยังโพรซีเดอร์ที่เก็บไว้

ควรทำงานดังนี้:

    List result = em
      .createNativeQuery("call getEmployeeDetails(:employeeId,:companyId)")
      .setParameter("emplyoyeeId", 123L)
      .setParameter("companyId", 456L)
      .getResultList();

อัปเดต:

หรืออาจจะไม่ควร

ในหนังสือEJB3 in Actionระบุไว้ในหน้า 383 ว่าJPA ไม่รองรับขั้นตอนการจัดเก็บ (หน้านี้เป็นเพียงภาพตัวอย่างเท่านั้นคุณไม่ได้รับข้อความแบบเต็มหนังสือทั้งเล่มสามารถดาวน์โหลดได้ในหลายที่รวมทั้งเล่มนี้ด้วยฉันไม่รู้ว่ามันถูกกฎหมายหรือเปล่า)

อย่างไรก็ตามข้อความคือ:

JPA และขั้นตอนการจัดเก็บฐานข้อมูล

หากคุณเป็นแฟนตัวยงของ SQL คุณอาจเต็มใจที่จะใช้ประโยชน์จากพลังของขั้นตอนการจัดเก็บฐานข้อมูล น่าเสียดายที่ JPA ไม่รองรับขั้นตอนการจัดเก็บและคุณต้องขึ้นอยู่กับคุณสมบัติที่เป็นกรรมสิทธิ์ของผู้ให้บริการการคงอยู่ของคุณ อย่างไรก็ตามคุณสามารถใช้ฟังก์ชันที่จัดเก็บอย่างง่าย (โดยไม่ต้องใช้พารามิเตอร์) กับแบบสอบถาม SQL ดั้งเดิม


ฉันพยายามและได้รับข้อความแสดงข้อผิดพลาดนี้: java.sql.SQLException: ไวยากรณ์ไม่ถูกต้องใกล้ '@ P0'
user431514

3
ควรเป็น "{call getEmployeeDetails (: workersId,: companyId)}" สำหรับเซิร์ฟเวอร์ SQL จะต้องมีวงเล็บปีกกา
Vedran

@Vedran จริง. ฉันสนใจเฉพาะส่วนการตั้งค่าพารามิเตอร์
Sean Patrick Floyd

9

วิธีการดึงพารามิเตอร์เอาต์พุตกระบวนงานที่เก็บไว้โดยใช้ JPA (2.0 ต้องการอิมพอร์ต EclipseLink และ 2.1 ไม่ได้)

แม้ว่าคำตอบนี้จะอธิบายอย่างละเอียดเกี่ยวกับการส่งคืนชุดระเบียนจากขั้นตอนการจัดเก็บ แต่ฉันกำลังโพสต์ที่นี่เพราะฉันต้องใช้เวลานานกว่าจะคิดออกและชุดข้อความนี้ช่วยฉันได้

แอปพลิเคชันของฉันใช้ Eclipselink-2.3.1 แต่ฉันจะบังคับให้อัปเกรดเป็น Eclipselink-2.5.0 เนื่องจาก JPA 2.1 มีการรองรับขั้นตอนการจัดเก็บที่ดีกว่ามาก

การใช้ EclipseLink-2.3.1 / JPA-2.0: Implementation-Dependent

เมธอดนี้ต้องการอิมพอร์ตคลาส EclipseLink จาก "org.eclipse.persistence" ดังนั้นจึงเฉพาะสำหรับการนำ Eclipselink ไปใช้งาน

ฉันพบที่ " http://www.yenlo.nl/en/calling-oracle-stored-procedures-from-eclipselink-with-multiple-out-parameters "

StoredProcedureCall storedProcedureCall = new StoredProcedureCall();
storedProcedureCall.setProcedureName("mypackage.myprocedure");
storedProcedureCall.addNamedArgument("i_input_1"); // Add input argument name.
storedProcedureCall.addNamedOutputArgument("o_output_1"); // Add output parameter name.
DataReadQuery query = new DataReadQuery();
query.setCall(storedProcedureCall);
query.addArgument("i_input_1"); // Add input argument names (again);
List<Object> argumentValues = new ArrayList<Object>();
argumentValues.add("valueOf_i_input_1"); // Add input argument values.
JpaEntityManager jpaEntityManager = (JpaEntityManager) getEntityManager();
Session session = jpaEntityManager.getActiveSession();
List<?> results = (List<?>) session.executeQuery(query, argumentValues);
DatabaseRecord record = (DatabaseRecord) results.get(0);
String result = String.valueOf(record.get("o_output_1")); // Get output parameter

การใช้ EclipseLink-2.5.0 / JPA-2.1: Implementation-Independent (มีเอกสารอยู่ในเธรดนี้แล้ว)

วิธีนี้ใช้งานได้โดยอิสระ (ไม่จำเป็นต้องนำเข้า Eclipslink)

StoredProcedureQuery query = getEntityManager().createStoredProcedureQuery("mypackage.myprocedure");
query.registerStoredProcedureParameter("i_input_1", String.class, ParameterMode.IN);
query.registerStoredProcedureParameter("o_output_1", String.class, ParameterMode.OUT);
query.setParameter("i_input_1", "valueOf_i_input_1");
boolean queryResult = query.execute();
String result = String.valueOf(query.getOutputParameterValue("o_output_1"));

8
อาตาของฉันเจ็บ นี่ไม่ได้ดีไปกว่า JDBC จริงๆเหรอ?
Lukas Eder

ฮ่าฮ่าใช่แล้ว อย่างไรก็ตามข้อดีของการใช้สิ่งเหล่านี้คือคุณไม่จำเป็นต้องพิมพ์โหลดโค้ดเพื่อรับคลาสอ็อบเจ็กต์ข้อมูลและคุณไม่ต้องทำบิตที่คุณถ่ายโอนข้อมูลทั้งหมดจาก recordSet ไปยังคลาสข้อมูลของคุณ . ยังคงมีวัตถุข้อมูล (เอนทิตี) แต่วิซาร์ด Eclipse จะสร้างให้คุณ
Malcolm Boekhoff

1
ใช่คุณทำได้ แต่ฉันกำลังบอกว่านี่เป็นผู้พัฒนาjOOQที่ทุกอย่างถูกสร้างขึ้น สิ่งเดียวที่ต้องทำคือการเรียกใช้ขั้นตอน / ฟังก์ชัน
Lukas Eder

คุณได้ลองใช้ตัวอย่างด้านล่าง (การใช้งานที่เป็นอิสระ) หรือไม่? ฉันลองใช้ความแตกต่างที่ขั้นตอนถูกกำหนดในxmlไฟล์และมันไม่ได้ผล ฉันไม่สามารถอ่านOUTพารามิเตอร์ได้
Roland

อย่างไรก็ตามสำหรับการใช้งาน JPA - 2.1 พารามิเตอร์ที่ตั้งชื่อไม่ได้ผลสำหรับฉัน แต่ฉันต้องส่งผ่าน Position Index ของพวกเขาใน Stored Procedures และสามารถรับผลลัพธ์สำหรับพารามิเตอร์เอาต์พุตได้สำเร็จ นี่เป็นกรณีเมื่อฉันมี Stored Procedure Returning Multiple Result Sets สำหรับ 1 ResultSet ฉันใช้ @Query
Radhesh Khanna

7
  1. สำหรับขั้นตอนการจัดเก็บง่ายๆที่ใช้พารามิเตอร์เข้า / ออกเช่นนี้

    CREATE OR REPLACE PROCEDURE count_comments (  
       postId IN NUMBER,  
       commentCount OUT NUMBER )  
    AS 
    BEGIN 
        SELECT COUNT(*) INTO commentCount  
        FROM post_comment  
        WHERE post_id = postId; 
    END;
    

    คุณสามารถโทรจาก JPA ได้ดังนี้:

    StoredProcedureQuery query = entityManager
        .createStoredProcedureQuery("count_comments")
        .registerStoredProcedureParameter(1, Long.class, 
            ParameterMode.IN)
        .registerStoredProcedureParameter(2, Long.class, 
            ParameterMode.OUT)
        .setParameter(1, 1L);
    
    query.execute();
    
    Long commentCount = (Long) query.getOutputParameterValue(2);
    
  2. สำหรับกระบวนงานที่จัดเก็บซึ่งใช้SYS_REFCURSORพารามิเตอร์ OUT:

    CREATE OR REPLACE PROCEDURE post_comments ( 
       postId IN NUMBER, 
       postComments OUT SYS_REFCURSOR ) 
    AS 
    BEGIN
        OPEN postComments FOR
        SELECT *
        FROM post_comment 
        WHERE post_id = postId; 
    END;
    

    คุณสามารถเรียกมันได้ดังนี้:

    StoredProcedureQuery query = entityManager
        .createStoredProcedureQuery("post_comments")
        .registerStoredProcedureParameter(1, Long.class, 
             ParameterMode.IN)
        .registerStoredProcedureParameter(2, Class.class, 
             ParameterMode.REF_CURSOR)
        .setParameter(1, 1L);
    
    query.execute();
    
    List<Object[]> postComments = query.getResultList();
    
  3. สำหรับฟังก์ชัน SQL ที่มีลักษณะดังนี้:

    CREATE OR REPLACE FUNCTION fn_count_comments ( 
        postId IN NUMBER ) 
        RETURN NUMBER 
    IS
        commentCount NUMBER; 
    BEGIN
        SELECT COUNT(*) INTO commentCount 
        FROM post_comment 
        WHERE post_id = postId; 
        RETURN( commentCount ); 
    END;
    

    เรียกแบบนี้ก็ได้ว่า

    BigDecimal commentCount = (BigDecimal) entityManager
    .createNativeQuery(
        "SELECT fn_count_comments(:postId) FROM DUAL"
    )
    .setParameter("postId", 1L)
    .getSingleResult();
    

    อย่างน้อยเมื่อใช้ Hibernate 4.x และ 5.x เนื่องจาก JPA StoredProcedureQueryไม่ทำงานกับ SQL FUNCTIONS

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีเรียกโพรซีเดอร์และฟังก์ชันที่จัดเก็บไว้เมื่อใช้ JPA และ Hibernate โปรดดูบทความต่อไปนี้


ฉันได้รับข้อความแสดงข้อผิดพลาด "หมายเลขผิดหรือประเภทของอาร์กิวเมนต์ที่โทรไปยัง ... " รู้ตัวอีกทีก็โทรcreateNativeQuery. ฉันเปลี่ยนมาcreateStoredProcedureQueryใช้ จากนั้น voila!
Ahmet

6

สำหรับฉันมีเพียงสิ่งต่อไปนี้เท่านั้นที่ใช้ได้กับ Oracle 11g และ Glassfish 2.1 (Toplink):

Query query = entityManager.createNativeQuery("BEGIN PROCEDURE_NAME(); END;");
query.executeUpdate();

ตัวแปรที่มีเครื่องหมายปีกกาส่งผลให้ ORA-00900


1
ทำงานให้ฉันบน Oracle 11g ผู้ให้บริการจำศีล JPA
David Mann

1
สิ่งนี้ทำให้เราหลุดพ้นจากปัญหาใหญ่หลวง เราใช้ java6, oracle11g, Jboss6, Hibernate ขอบคุณ @Chornyi
Abdullah Khan

6

หากใช้ EclipseLink คุณสามารถใช้ @NamedStoredProcedureQuery หรือ StoreProcedureCall เพื่อดำเนินการโพรซีเดอร์ที่เก็บไว้รวมถึงรายการที่มีพารามิเตอร์เอาต์พุตหรือเคอร์เซอร์ออก นอกจากนี้ยังรองรับฟังก์ชันที่จัดเก็บไว้และชนิดข้อมูล PLSQL

ดู http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Stored_Procedures


1
EclipseLink เวอร์ชันใดที่มี EntityManager.createNamedStoredProcedureQuery ()
Mircea Ion


2

อาจจะไม่เหมือนกันสำหรับ Sql Srver แต่สำหรับคนที่ใช้ oracle และ eclipslink มันใช้ได้กับฉัน

เช่นขั้นตอนที่มีพารามิเตอร์ IN หนึ่งตัว (ชนิด CHAR) และพารามิเตอร์ OUT สองตัว (NUMBER & VARCHAR)

ใน persistence.xml ประกาศหน่วยการคงอยู่:

<persistence-unit name="presistanceNameOfProc" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/DataSourceName</jta-data-source>
    <mapping-file>META-INF/eclipselink-orm.xml</mapping-file>
    <properties>
        <property name="eclipselink.logging.level" value="FINEST"/>
        <property name="eclipselink.logging.logger" value="DefaultLogger"/>
        <property name="eclipselink.weaving" value="static"/>
        <property name="eclipselink.ddl.table-creation-suffix" value="JPA_STORED_PROC" />
    </properties>
</persistence-unit>

และประกาศโครงสร้างของ proc ใน eclipselink-orm.xml

<?xml version="1.0" encoding="UTF-8"?><entity-mappings version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd">
<named-stored-procedure-query name="PERSIST_PROC_NAME" procedure-name="name_of_proc" returns-result-set="false">
    <parameter direction="IN" name="in_param_char" query-parameter="in_param_char" type="Character"/>
    <parameter direction="OUT" name="out_param_int" query-parameter="out_param_int" type="Integer"/>
    <parameter direction="OUT" name="out_param_varchar" query-parameter="out_param_varchar" type="String"/>
</named-stored-procedure-query>

ในรหัสคุณต้องเรียก proc ของคุณดังนี้:

try {
        final Query query = this.entityManager
                .createNamedQuery("PERSIST_PROC_NAME");
        query.setParameter("in_param_char", 'V'); 
        resultQuery = (Object[]) query.getSingleResult();

    } catch (final Exception ex) {
        LOGGER.log(ex);
        throw new TechnicalException(ex);
    }

เพื่อรับพารามิเตอร์เอาต์พุตสองตัว:

Integer myInt = (Integer) resultQuery[0];
String myStr =  (String) resultQuery[1];

2

สิ่งนี้ได้ผลสำหรับฉัน

@Entity
@Table(name="acct")
@NamedNativeQueries({
 @NamedNativeQuery(callable=true, name="Account.findOne", query="call sp_get_acct(?), resultClass=Account.class)})
public class Account{
 // Code 
}

หมายเหตุ: ในอนาคตหากคุณตัดสินใจที่จะใช้ findOne เวอร์ชันเริ่มต้นให้แสดงความคิดเห็นคำอธิบายประกอบ NamedNativeQueries และ JPA จะเปลี่ยนเป็นค่าเริ่มต้น


หากฉันต้องการโทรตามขั้นตอนภายในแพ็กเกจเฉพาะฉันควรโทรด้วยวิธีนี้: โทรไปที่ {package}. {procedure} หรือไม่
Raju yourPepe

1

คำตอบนี้อาจเป็นประโยชน์หากคุณมีผู้จัดการนิติบุคคล

ฉันมีขั้นตอนการจัดเก็บเพื่อสร้างหมายเลขถัดไปและในฝั่งเซิร์ฟเวอร์ฉันมีกรอบตะเข็บ

ด้านลูกค้า

 Object on = entityManager.createNativeQuery("EXEC getNextNmber").executeUpdate();
        log.info("New order id: " + on.toString());

ฝั่งฐานข้อมูล (เซิร์ฟเวอร์ SQL) ฉันได้จัดเก็บโพรซีเดอร์ที่ชื่อ getNextNmber


executeUpdate () ส่งคืน int แน่ใจว่าคุณได้รับเอาต์พุต sproc?
Constantine Gladky


1

JPA 2.0 ไม่รองรับค่า RETURN เฉพาะการโทร

วิธีแก้ปัญหาของฉันคือ. สร้างกระบวนการเรียกใช้ฟังก์ชัน

ดังนั้นภายในโค้ด JAVA คุณจะเรียกใช้ NATIVE QUERY ที่เรียกใช้ oracle FUNCTION


0

ในการเรียกเก็บโพรซีเดอร์เราสามารถใช้ Callable Statement ในแพ็คเกจ java.sql


ขอบคุณสำหรับการตอบกลับของคุณ. ดังนั้น sql สำหรับ callable statement จะเป็น {? = เรียก getEmployeeDetails (?,?)} หรือต้องการระบุพารามิเตอร์เอาต์พุตทั้งหมด
user431514

0

ลองใช้รหัสนี้:

return em.createNativeQuery("{call getEmployeeDetails(?,?)}",
                               EmployeeDetails.class)           
                               .setParameter(1, employeeId)
                               .setParameter(2, companyId).getResultList();

0

persistence.xml

 <persistence-unit name="PU2" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jndi_ws2</non-jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties/>

codigo java

  String PERSISTENCE_UNIT_NAME = "PU2";
    EntityManagerFactory factory2;
    factory2 = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

    EntityManager em2 = factory2.createEntityManager();
    boolean committed = false;
    try {

        try {
            StoredProcedureQuery storedProcedure = em2.createStoredProcedureQuery("PKCREATURNO.INSERTATURNO");
            // set parameters
            storedProcedure.registerStoredProcedureParameter("inuPKEMPRESA", BigDecimal.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("inuPKSERVICIO", BigDecimal.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("inuPKAREA", BigDecimal.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("isbCHSIGLA", String.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("INUSINCALIFICACION", BigInteger.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("INUTIMBRAR", BigInteger.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("INUTRANSFERIDO", BigInteger.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("INTESTADO", BigInteger.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("inuContador", BigInteger.class, ParameterMode.OUT);

            BigDecimal inuPKEMPRESA = BigDecimal.valueOf(1);
            BigDecimal inuPKSERVICIO = BigDecimal.valueOf(5);
            BigDecimal inuPKAREA = BigDecimal.valueOf(23);
            String isbCHSIGLA = "";
            BigInteger INUSINCALIFICACION = BigInteger.ZERO;
            BigInteger INUTIMBRAR = BigInteger.ZERO;
            BigInteger INUTRANSFERIDO = BigInteger.ZERO;
            BigInteger INTESTADO = BigInteger.ZERO;
            BigInteger inuContador = BigInteger.ZERO;

            storedProcedure.setParameter("inuPKEMPRESA", inuPKEMPRESA);
            storedProcedure.setParameter("inuPKSERVICIO", inuPKSERVICIO);
            storedProcedure.setParameter("inuPKAREA", inuPKAREA);
            storedProcedure.setParameter("isbCHSIGLA", isbCHSIGLA);
            storedProcedure.setParameter("INUSINCALIFICACION", INUSINCALIFICACION);
            storedProcedure.setParameter("INUTIMBRAR", INUTIMBRAR);
            storedProcedure.setParameter("INUTRANSFERIDO", INUTRANSFERIDO);
            storedProcedure.setParameter("INTESTADO", INTESTADO);
            storedProcedure.setParameter("inuContador", inuContador);

            // execute SP
            storedProcedure.execute();
            // get result

            try {
                long _inuContador = (long) storedProcedure.getOutputParameterValue("inuContador");
                varCon = _inuContador + "";
            } catch (Exception e) {
            } 
        } finally {

        }
    } finally {
        em2.close();
    }

4
โปรดอย่าลังเลที่จะเพิ่มความคิดเห็นใด ๆ ในคำตอบของคุณ (นอกเหนือจากรหัสบริสุทธิ์)
ivan.mylyanyk

0

จาก JPA 2.1 JPA สนับสนุนการเรียกโพรซีเดอร์ที่เก็บไว้โดยใช้ StoredProcedureQuery แบบไดนามิกและ @NamedStoredProcedureQuery ที่ประกาศ


-2

วิธีแก้ปัญหาของฉันคือ. สร้างกระบวนการเรียกใช้ฟังก์ชัน

ดังนั้นภายในโค้ด JAVA คุณจะเรียกใช้ NATIVE QUERY ที่เรียกใช้ oracle FUNCTION

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.