কীভাবে জাভা এবং জেপিএ থেকে কোনও সঞ্চিত প্রক্রিয়া কল করবেন


95

আমি একটি সঞ্চিত পদ্ধতিতে কল করতে এবং কিছু ডেটা পুনরুদ্ধার করার জন্য একটি সাধারণ ওয়েব অ্যাপ্লিকেশন লিখছি। এটি একটি খুব সাধারণ অ্যাপ্লিকেশন, যা ক্লায়েন্টের ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করে। আমরা কর্মচারী আইডি এবং সংস্থার আইডি পাস করি এবং সঞ্চিত পদ্ধতি কর্মীদের বিবরণ ফিরিয়ে দেবে।

ওয়েব অ্যাপ্লিকেশন ডেটা আপডেট / মুছতে পারে না এবং এসকিউএল সার্ভার ব্যবহার করে।

আমি আমার ওয়েব অ্যাপ্লিকেশনটি জবস এএস-এ স্থাপন করছি। সঞ্চিত পদ্ধতি অ্যাক্সেস করতে আমি কি জেপিএ ব্যবহার করব বা CallableStatement। এক্ষেত্রে জেপিএ ব্যবহারের কোনও সুবিধা।

এছাড়াও এই সঞ্চিত পদ্ধতিটি কল করার জন্য বর্ধিত বিবরণটি কী হবে। আমি আগে কখনও সঞ্চিত পদ্ধতি ব্যবহার করি নি এবং আমি এটির সাথে লড়াই করছি। গুগল খুব একটা সাহায্য ছিল না।

এখানে সঞ্চিত পদ্ধতি:

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

হালনাগাদ:

জেপিএ ব্যবহার করে সঞ্চিত পদ্ধতিতে কল করার ক্ষেত্রে অন্য কারও সমস্যা রয়েছে ।

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

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

আমি যে বিষয়গুলি লক্ষ্য করেছি:

  1. প্যারামিটারের নামগুলি আমার পক্ষে কাজ করে না, সুতরাং পরামিতি সূচকটি ব্যবহার করে দেখুন।
  2. {call sp_name(?,?)}পরিবর্তে sql বিবৃতি সঠিক করুনcall sp_name(?,?)
  3. সঞ্চিত পদ্ধতি ফলে সেট ফিরে আসছে, এমনকি যদি আপনি শুধুমাত্র এক সারি সঙ্গে জানেন, তাহলে getSingleResultঅভ্যস্ত কাজ
  4. একটি resultSetMappingনাম বা ফলাফল শ্রেণীর বিবরণ পাস করুন

4
নেটিভ ক্যোয়ারিতে আপনি নামযুক্ত প্যারামিটার ব্যবহার করতে পারবেন না । নামযুক্ত প্যারামিটারগুলি কেবল জেপিকিউএল কোয়েরিতে সমর্থিত। (আপনি যদি নামকরণের প্যারামিটারগুলি পছন্দ করেন তবে
নাম্বারযুক্ত

আমি সর্বদা ক্রিয়েটনেটিভ কিওয়ারিগুলির সাথে নামযুক্ত প্যারামিটার ব্যবহার করেছি এবং কখনও কোনও সমস্যা হয়নি। আমি যে বর্তমান সিস্টেমে কাজ করছি তা একবার দেখেছি এবং নামকরণকৃত প্যারামিটারগুলির সাথে প্রচুর দেশীয় ক্যোয়ারী রয়েছে। আপনি কি আমাদের নিশ্চিতকরণের জন্য কিছু রেফারেন্স সরবরাহ করতে পারেন? আমাদের সেটটি জেপিএ 2 এবং হাইবারনেট 4+।
জামেজেরা

উত্তর:


59

জেপিএ ২.১ এখন সঞ্চিত প্রক্রিয়া সমর্থন করে, জাভা ডকটি এখানে পড়ুন

উদাহরণ:

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

আমি আমার ওয়েব অ্যাপ্লিকেশনটি জবস এএস-এ স্থাপন করছি। সঞ্চিত পদ্ধতি বা কলএলস্টেটমেন্ট অ্যাক্সেস করার জন্য আমার কি জেপিএ ব্যবহার করা উচিত। এক্ষেত্রে জেপিএ ব্যবহারের কোনও সুবিধা।

এটি সত্যিই জেপিএ দ্বারা সমর্থিত নয় তবে এটি কার্যক্ষম । তবুও আমি এই পথে যাব না:

  • কিছু শিমের মধ্যে সঞ্চিত পদ্ধতি কলের ফলাফলের মানচিত্রের জন্য জেপিএ ব্যবহার করা সত্যিই ওভারকিল,
  • বিশেষত জেপিএ সঞ্চিত প্রক্রিয়া কল করতে সত্যই যথাযথ নয় বলে দেওয়া হয়েছে (সিনট্যাক্সটি বেশ ভার্জোজ হবে)।

আমি এইভাবে বরং জেডিবিসি ডেটা অ্যাক্সেসের জন্য স্প্রিং সমর্থন , বা মাইবাটিসের মতো ডেটা ম্যাপার বা আপনার অ্যাপ্লিকেশনটির সরলতা, কাঁচা জেডিবিসি এবং CallableStatement। আসলে, জেডিবিসি সম্ভবত আমার পছন্দ হবে। এখানে একটি বেসিক কিকঅফ উদাহরণ রয়েছে:

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 , এটা পৃষ্ঠা 383 তে বলেছেন, যে JPA সঞ্চিত পদ্ধতি সমর্থন করে না (পৃষ্ঠা শুধুমাত্র একটি পূর্বরূপ, আপনি সম্পূর্ণ টেক্সট পাবেন না হয়, সম্পূর্ণ পুস্তক সহ বিভিন্ন জায়গায় কোন ডাউনলোড হিসাবে পাওয়া যায় এই এক , যদিও এটি আইনী কিনা আমি জানি না)।

যাইহোক, পাঠ্যটি হ'ল:

জেপিএ এবং ডাটাবেস সঞ্চিত পদ্ধতি

আপনি যদি এসকিউএল এর একটি বড় অনুরাগী হন তবে আপনি ডাটাবেস সঞ্চিত প্রক্রিয়াগুলির শক্তি কাজে লাগাতে ইচ্ছুক হতে পারেন। দুর্ভাগ্যক্রমে, জেপিএ সঞ্চিত পদ্ধতিগুলি সমর্থন করে না এবং আপনাকে আপনার অধ্যবসায় সরবরাহকারীর মালিকানা বৈশিষ্ট্যের উপর নির্ভর করতে হবে। তবে, আপনি একটি স্থানীয় এসকিউএল কোয়েরি সহ সাধারণ সঞ্চিত ফাংশন (পরামিতি ছাড়াই) ব্যবহার করতে পারেন।


আমি চেষ্টা করেছিলাম এবং এই ত্রুটি বার্তাটি পেয়েছি: java.sql.SQLException: '@ P0' এর কাছে ভুল সিনট্যাক্স।
ব্যবহারকারী 431514

4
এটি "get কল getEmployeeDetails (: কর্মচারী ID:: CompanyId) be" হওয়া উচিত, এসকিউএল সার্ভারের জন্য এটিতে কোঁকড়া ধনুর্বন্ধনী থাকতে হবে।
বেদরান

@ ওয়েদারান সত্য আমি কেবলমাত্র প্যারামিটার সেটিং অংশে আগ্রহী ছিলাম
সান প্যাট্রিক ফ্লয়েড

9

জেপিএ ব্যবহার করে সঞ্চিত প্রক্রিয়া আউটপুট প্যারামিটার কীভাবে পুনরুদ্ধার করবেন (২.০- এর জন্য এক্সপ্লেলিঙ্ক আমদানি প্রয়োজন এবং ২.১ এর প্রয়োজন নেই)

যদিও এই উত্তরটি কোনও সঞ্চিত প্রক্রিয়া থেকে রেকর্ডসেট ফিরিয়ে দেওয়ার বিষয়ে বিস্তৃত নয়, আমি এখানে পোস্ট করছি, কারণ এটি খুঁজে পেতে আমার বয়স হয়েছিল এবং এই থ্রেডটি আমাকে সহায়তা করেছিল।

আমার অ্যাপ্লিকেশনটি Eclipselink-2.3.1 ব্যবহার করছিল, তবে আমি Eclipselink-2.5.0 এ একটি আপগ্রেডকে বাধ্য করব, কারণ জেপিএ ২.১ সঞ্চিত পদ্ধতিগুলির জন্য আরও ভাল সমর্থন পেয়েছে।

EclipseLink-2.3.1 / JPA-2.0 ব্যবহার: প্রয়োগ-নির্ভর end

এই পদ্ধতির জন্য "org.eclipse.persistance" থেকে EclipseLink ক্লাস আমদানি করা দরকার, তাই এটি Eclipselink বাস্তবায়নের জন্য নির্দিষ্ট।

আমি এটি " http://www.yenlo.nl/en/calling-oracle-stored-procedures-from-eclipselink-with- মাল্টিপল- আউট-প্যারামিটারে " পেয়েছি ।

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 ব্যবহার করে: বাস্তবায়ন-স্বতন্ত্র (ইতিমধ্যে এই থ্রেডে নথিভুক্ত)

এই পদ্ধতিটি বাস্তবায়ন স্বাধীন (এক্লিপ্লিংক আমদানির প্রয়োজন নেই)।

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
আঃ, আমার চোখে ব্যথা। এটি আসলে জেডিবিসির চেয়ে অনেক বেশি ভাল নয়, তাই না?
লুকাস এদার

হাহা, হ্যাঁ পয়েন্ট নেওয়া হয়েছে। তবে এই জিনিসগুলি ব্যবহারের উপকারিতা হ'ল ডেটা অবজেক্ট ক্লাসটি পেতে আপনাকে কোডের একটি লোড টাইপ করতে হবে না এবং আপনি যেখানে রেকর্ডসেট থেকে সমস্ত ডেটা আপনার ডেটা ক্লাসে স্থানান্তর করেন সেখানে আপনাকে কিছু করতে হবে না the । এখনও একটি ডেটা অবজেক্ট (সত্তা) রয়েছে, তবে ইক্লিপস উইজার্ড এটি আপনার জন্য উত্পন্ন করে।
ম্যালকম বোয়েখফ

4
হ্যাঁ, আপনি করতে পারেন। তবে আমি এটি JOOQ এর বিকাশকারী হিসাবে বলছি , যেখানে সবকিছু উত্পন্ন হয়। কেবলমাত্র কাজটি কেবল প্রক্রিয়া / ফাংশনকে কল করা।
লুকাশ এডার

আপনি কি আসলে নীচের উদাহরণটি প্রয়োগ করেছেন (বাস্তবায়ন স্বাধীন)? পদ্ধতিটি কোনও xmlফাইলে সংজ্ঞায়িত করা হয়েছিল এবং এটি কার্যকর হয়নি তার পার্থক্যের সাথে আমি চেষ্টা করেছিলাম । আমি OUTপ্যারামিটারটি পড়তে পারি না ।
রোল্যান্ড

কোনওভাবে জেপিএ - ২.১ বাস্তবায়ন, নামযুক্ত পরামিতিগুলি আমার পক্ষে কাজ করছে না। পরিবর্তে, আমাকে সঞ্চিত পদ্ধতিতে তাদের অবস্থান সূচকটি পাস করতে হয়েছিল এবং আউটপুট প্যারামিটারের জন্য সফলভাবে ফলাফল পেতে সক্ষম হয়েছি। এই ক্ষেত্রে যখন আমি একাধিক ফলাফলের ফলাফলগুলি রিটার্নিং পদ্ধতি সংরক্ষণ করি। 1 টি রেজাল্টসেটের জন্য আমি সহজেই @ কিচুরি ব্যবহার করেছি
রাধেশ খান্না

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আউট প্যারামিটার ব্যবহার করে :

    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. নিম্নলিখিত হিসাবে দেখায় এমন একটি এসকিউএল ফাংশনের জন্য:

    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();
    

    কমপক্ষে হাইবারনেট 4.x এবং 5.x ব্যবহার করার সময় কারণ জেপিএ StoredProcedureQueryএসকিউএল ফাংশনগুলির জন্য কাজ করে না।

জেপিএ এবং হাইবারনেট ব্যবহার করার সময় কীভাবে সঞ্চিত পদ্ধতি এবং ফাংশনগুলিতে কল করা যায় সে সম্পর্কে আরও তথ্যের জন্য নীচের নিবন্ধগুলি দেখুন


আমি "ভুল নাম্বার বা কল করার জন্য যুক্তির ধরণের ধরণের ..." ত্রুটি বার্তা পেয়েছি। আমি বুঝতে পারি যে আমি ফোন করছি createNativeQuery। আমি স্যুইচ করেছি createStoredProcedureQuery। তাহলে, ভয়েলা!
আহমেত

6

আমার জন্য, কেবল নিম্নলিখিতগুলি ওরাকল 11 জি এবং গ্লাসফিশ ২.১ (টপলিংক) এর সাথে কাজ করেছেন:

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

কোঁকড়া ধনুর্বন্ধনী সঙ্গে বৈকল্পিকের ফলাফল ওআরএ -00900 হয়েছে।


4
ওরাকল 11 জি, হাইপারনেট জেপিএ সরবরাহকারী আমার জন্য কাজ করে।
ডেভিড মান 21

4
এটি আমাদের একটি চূড়ান্ত ঝামেলা থেকে মুক্তি দিয়েছে। আমরা java6, ওরাকল 11g, Jboss6, হাইবারনেট ব্যবহার করছিলাম। ধন্যবাদ @ চর্নি
আবদুল্লাহ খান

6

যদি EclipseLink ব্যবহার করে থাকেন তবে আপনি আউটপুট প্যারামিটারগুলি বা আউট কার্সার সহ যে কোনও সঞ্চিত প্রক্রিয়া সম্পাদন করতে @ নেমডস্টোরেডপ্রসর্ডারকিউয়ারি বা StoreProcedureCall ব্যবহার করতে পারেন। সঞ্চিত ফাংশন এবং পিএলএসকিউএল ডেটা-টাইপের জন্য সমর্থন উপলব্ধ।

দেখুন, http://en.wikibooks.org/wiki/Java_Persistance/Advanced_Topics# স্টোর_প্রসেসস


4
ইক্লিপস লিঙ্কের কোন সংস্করণটির সত্ত্বা ম্যানেজার.ক্রেটনমেড স্টোরেডপ্রসেসচার কিওয়ারি () রয়েছে?
মিরসিয়া আয়ন

3

নিম্নলিখিতটি আমার পক্ষে কাজ করে:

Query query = em.createNativeQuery("BEGIN VALIDACIONES_QPAI.RECALC_COMP_ASSEMBLY('X','X','X',0); END;");
query.executeUpdate();

আউট এবং ইনওউট প্যারামিটারগুলি এই এপিআই ব্যবহার করে কাজ করবে না। En.wikibooks.org/wiki/Java_Persistance/…
ভ্যালেন্টিন

2

এটি এসকিএল সার্ভারের জন্য একই নয় তবে ওরাকল এবং গ্রিপস্লিঙ্ক ব্যবহার করা লোকদের জন্য এটি আমার পক্ষে কাজ করছে

উদাহরণস্বরূপ: একটি প্রক্রিয়া যার মধ্যে একটি প্যারাম রয়েছে (CHAR টাইপ করুন) এবং দুটি আউট প্যারাম (সংখ্যা এবং VARCHAR)

অধ্যবসায়.এক্সএমএল দৃ pers়তা-ইউনিট ঘোষণা:

<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>

এবং গ্রহপরিবর্তন- 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>

কোডটিতে আপনাকে কেবল আপনার প্রোকটিকে এভাবে কল করতে হবে:

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 
}

দ্রষ্টব্য: ভবিষ্যতে আপনি যদি ফাইন্ডওনের ডিফল্ট সংস্করণটি ব্যবহার করার সিদ্ধান্ত নেন তবে কেবল নামডাইভেটিভ কোয়েরিজ টীকা মন্তব্য করুন এবং জেপিএ ডিফল্টে স্যুইচ করবে


যদি আমি নির্দিষ্ট প্যাকেজের মধ্যে প্রক্রিয়া কল করতে চাই, তবে কি আমাকে এইভাবে কল করা উচিত: কল করুন {প্যাকেজ}। {পদ্ধতি}?
রাজু আপনার পেপ

1

আপনার সত্তা পরিচালক থাকলে এই উত্তরটি সহায়ক হতে পারে

পরের নম্বরটি তৈরি করার জন্য আমার কাছে একটি সঞ্চিত পদ্ধতি ছিল এবং সার্ভারের পাশে আমার কাছে ফ্রেম ফ্রেম থাকে।

মক্কেলের পক্ষে

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

ডাটাবেস সাইড (এসকিউএল সার্ভার) আমি প্রক্রিয়াটির নাম সংরক্ষণ করেছি getNextNmber


এক্সিকিউটআপডেট () রিটার্ন ইনট। আপনি কি স্প্রোকের প্রাপ্তি নিশ্চিত?
কনস্টান্টাইন গ্ল্যাডকি

1

আপনি @Query(value = "{call PROC_TEST()}", nativeQuery = true)আপনার সংগ্রহস্থল ব্যবহার করতে পারেন । এটি আমার পক্ষে কাজ করেছে।

মনোযোগ দিন: '{' এবং '}' ব্যবহার করুন অন্যথায় এটি কাজ করবে না।


1

JPA 2.0 রিটার্ন মানগুলি সমর্থন করে না, কেবলমাত্র কল calls

আমার সমাধান ছিল। একটি ফাংশন কলিং প্রক্রিয়া তৈরি করুন।

সুতরাং, জাভা কোডের অভ্যন্তরে আপনি একটি NATIVE QUERY নির্বাহ করবেন যাতে ওরাকলটি ফাংশন বলে।


0

সঞ্চিত পদ্ধতিটি কল করতে আমরা java.sql প্যাকেজে কলএল স্টেটমেন্ট ব্যবহার করতে পারি।


আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. সুতরাং কলযোগ্য বিবৃতি জন্য বর্গক্ষেত্র হবে {? = getEmployeeDetails (?,?) কল করুন} বা সমস্ত আউটপুট পরামিতি নির্দিষ্ট করতে হবে
user431514


0

দৃistence়তা.এক্সএমএল

 <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/>

কোডিগো জাভা

  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

জেপিএ ২.১ থেকে, জেপিএ গতিশীল স্টোরেডপ্রসেসুয়েচারি এবং ডিক্যালিটিভর @ নেমেডস্টোরেডপ্রসেসুয়েরকিউরি ব্যবহার করে সঞ্চিত পদ্ধতিগুলি কল করতে সমর্থন করে।


-2

আমার সমাধান ছিল। একটি ফাংশন কলিং প্রক্রিয়া তৈরি করুন।

সুতরাং, জাভা কোডের অভ্যন্তরে আপনি একটি NATIVE QUERY নির্বাহ করবেন যাতে ওরাকলটি ফাংশন বলে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.