2013-02-15 72 views
5

संपादित करें: हालांकि इस प्रश्न में से कुछ उत्तर अलग-अलग समस्याओं के साथ दूसरों की मदद कर सकते हैं, समाधान वास्तव में डेटाबेस कनेक्शन पर ऑटो-प्रतिबद्ध सुविधा के साथ कुछ बग से संबंधित था! क्वेरी निष्पादित करने के बाद प्रतिबद्धता को मजबूर करने के कारण डेटाबेस ने परिवर्तनों को प्रतिबिंबित किया, इस प्रकार नीचे दिखाया गया कोड इस प्रकार की संग्रहीत प्रक्रिया को कॉल करने का सही तरीका हैजावा: एक ऑरैकल डेटाबेस में संग्रहीत प्रक्रिया को कॉल करना

मैं एक ऑरैकल में एक साधारण संग्रहीत प्रक्रिया को कॉल करने की कोशिश कर रहा हूं डेटाबेस।

कोई
procedure clear_orderProcDtlByOrdId(p_order_id in order_header.order_id%type, 
            p_transaction_id in sl_order_processing_dtl.transaction_id%type DEFAULT NULL, 
            p_item_action_id in sl_order_processing_dtl.item_action_id%type DEFAULT NULL) 
... 

जावा कोड मैं इस

try 
    { 
     CallableStatement storedProc = conn.prepareCall("{call PKG_PI_FRAUD.clear_orderProcDtlByOrdId(?)}"); 
     storedProc.setString(1, orderID); 
     storedProc.execute(); 
    } 
    catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 

मैं सब पर किसी भी त्रुटि प्राप्त नहीं हो रहा की तरह दिखता में परेशानी आ रही है, हालांकि ऐसे हैं:

प्रक्रिया इस तरह दिखता है डेटाबेस परिवर्तन परिलक्षित किया जा रहा है। जब मैं SQL डेवलपर में प्रक्रिया चलाता हूं तो मुझे परिणाम दिखाई देते हैं। मैंने सोचा कि यह एक प्रतिबद्ध मुद्दे के कारण हो सकता है, लेकिन मैंने जो कनेक्शन स्थापित किया है वह ऑटो-प्रतिबद्ध मोड में है।

किसी भी मदद की सराहना की जाएगी!

+0

ऑर्डर आईडी डीबी में वचरर पर सेट है? – PermGenError

+0

@PremGenError ऑर्डर आईडी डीबी – aeros

+0

में एक VARCHAR2 है पैरामीटर के चारों ओर उद्धरण डालने का प्रयास करें, फिर लाइन 2 पर: storeProc.setString ("1", "orderID"); – twoleggedhorse

उत्तर

1

हालांकि इस प्रश्न में से कुछ उत्तर अलग-अलग समस्याओं के साथ दूसरों की मदद कर सकते हैं, समाधान वास्तव में डेटाबेस कनेक्शन पर ऑटो-प्रतिबद्ध सुविधा के साथ कुछ बग से संबंधित था! क्वेरी निष्पादित करने के बाद प्रतिबद्धता को मजबूर करने से डाटाबेस ने परिवर्तनों को प्रतिबिंबित किया, इस प्रकार प्रश्न में दिखाया गया कोड इस प्रकार की संग्रहीत प्रक्रिया को कॉल करने का सही तरीका है!

1

ओरेकल डेटाबेस में प्रक्रिया की वापसी को कैप्चर करने में सक्षम होने के लिए, इसे आज़माएं।

SimpleJdbcCall call = Util.getSimpleJdbcCallInstance(); 
    call.setProcedureName("PROCED_CONDOMINIAL"); 
    call.declareParameters(
      new SqlParameter("CONDOMINIO", Types.VARCHAR), 
      new SqlParameter("BLOCO", Types.VARCHAR),, 
      new SqlOutParameter("P_NUMERO", Types.NUMERIC), 
      new SqlOutParameter("P_LOG", Types.VARCHAR)); 

    Map<String, Object> parametros = new HashMap<String, Object>(); 
    parametros.put("CONDOMINIO_IC", descricaoCondominio); 
    parametros.put("BLOCO_IC", imovelCondominial.getBloco()); 

    Map<String, Object> out = call.execute(parametros); 
    BigDecimal chave = (BigDecimal) out.get("P_NUMERO"); 
    imovelCondominial.setId(chave.longValue()); 

और प्रक्रिया

create or replace PROCEDURE   PROCED_CONDOMINIAL 
       (CONDOMINIO   VARCHAR2, 
       BLOCO     VARCHAR2, 
       NUMERO    OUT NUMBER, 
       LOG     OUT VARCHAR2)  -- PARAMETROS DE SAIDAS (OUT).- 

यहां काम की घोषणा:

public static void main(String[] args) { 

     try { 

      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
      Connection con = DriverManager.getConnection(url, db_user, password); 
      System.out.println("Connected to database"); 

      SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
      Date now = new java.sql.Date(simpleDateFormat.parse("12/02/2001").getTime()); 

      String command = "{call SALDOS(?,?)}"; 
      CallableStatement cstmt = con.prepareCall(command); 
      cstmt.registerOutParameter(2, Types.DECIMAL); 

      cstmt.setDate(1, now); 
      cstmt.execute(); 
      Double str = cstmt.getDouble(2); 

      cstmt.close(); 
      System.out.println("Retorno: " + str); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

आप एक अलग रिटर्न का उपयोग करते हैं SimpleJdbcCall इस तरह के मानचित्र। इस ब्लॉग को देखो।

http://jameajudo.blogspot.com.br/2009/03/call-procedure-oracle-with-java-and.html

ओरेकल 10xe और 11xe पर परीक्षण किया गया।