الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

خطا فى جملة Pl_sql

Featured Replies

بتاريخ:

السلام عليكم ورحمة الله وبركاته

المطلوب من جملة select اجيب قيمة المتغير COUNTER

هذه الخظا يظهر لى

 
eeeeeeeeeeejava.sql.SQLException: ORA-06550: سطر 2 ، عمود  22 : 
PLS-00201: identifier 'COUNTER' must be declared
ORA-06550: سطر 2 ، عمود  30 : 
PL/SQL: ORA-00904: : معرف غير صالح
ORA-06550: سطر 2 ، عمود  1 : 
PL/SQL: SQL Statement ignored
 
 
من هذا الكود
 
    public boolean validateCHEKB_NO(String b_no) {        
        int result=0;
        int COUNTER=2;
        String PlSQLCode=
            "BEGIN\n" + 
        "SELECT COUNT(*) INTO COUNTER "+
        "FROM ITEMS\n" + 
        "WHERE trim(b_no)=? ;\n" + 
        "END;";
        CallableStatement stat=null;     
                                  try {
                                   stat=getDBTransaction().createCallableStatement(PlSQLCode,getDBTransaction().DEFAULT);
                                    stat.setString(1, b_no);                                      
                                    result=stat.executeUpdate();
                                      
                                  } catch (Exception e) {
                                      // TODO: Add catch code                                     
                                      System.out.println("eeeeeeeeeee"+e); 
                                      System.out.println("dddddddddddddd"+PlSQLCode);
                                      e.printStackTrace();
                                  } finally {
                                    try {
                                          stat.close();     
                                      } catch (Exception e) {
 
 
 
                                          // TODO: Add catch code
                                          e.printStackTrace();
                                      }  
                                     
                                  }  
                                    setbal (BigDecimal.ZERO);
                                    System.out.println(COUNTER);
                                    System.out.println("xxxxxxx"+result);
                                    System.out.println("gggggggggggg");
                                return true;  
                                }

مع خالص الشكر

  • الردود 30
  • المشاهدات 3.2k
  • البداية
  • اخر رد

أكثر المشاركين في هذا الموضوع

بتاريخ:

متغيرات جافا لا يتم الوصول لها من كود PL

لكن ما تقوم به هو جملة استعلام عادية جداً فلماذا تقوم بها باستخدام CallableStatement

بتاريخ:
  • كاتب الموضوع

شكرا يا باشمهندس

 

هو المطلوب من جملة SELECT اجيب قيمة المتغير COUNTER  بناء على شرط معين بحيث منها اعرف ال ITEM موجود او اعتبره ITEM جديد

وبالتالى عند الحفظ اعمل UPDATE   ام    INSERT

 

وجملة SELECT على هذا النحو

 

        String PlSQLCode=
            "BEGIN\n" + 
        "SELECT COUNT(*) INTO COUNTER "+
        "FROM ITEMS\n" + 
        "WHERE trim(b_no)=? ;\n" + 
        "END;";
بتاريخ:

يمكن أن تقوم بتنفيذها باستخدام PreparedStatement عادية

أو لو تريد عملها بهذه الطريقة فيمكنك عمل out parameter

لكن ما كتبته لا يصلح لأنك لم تقم بإرجاع قيمة المتغير counter بأي طريقة

بتاريخ:
  • كاتب الموضوع

شكرا  يا باشمهندس

 

طيب ازاى اعمل ال OUT PARAMETER

بتاريخ:

في كود SQL تستطيع تعريف out parameter

aa number out

بتاريخ:
  • كاتب الموضوع

 

شكرا يا باشمهندس  

 

الكود بهذا الشكل

 

COUUNTER Number out;

BEGIN

SELECT COUNT(*) INTO COUNTER FROM ITEMS

WHERE trim(b_no)=? ;

END;

 

بتاريخ:

لا ليس هكذا

أنت تقوم بإنشاء procedure به out parameter وبالتالي تستطيع إرجاعه

بتاريخ:
  • كاتب الموضوع

الف شكرا يا باشمهندس 

جارى تنفيذ ذلك 

بتاريخ:

بالتوفيق

بتاريخ:
  • كاتب الموضوع

procedure    

create or replace
PROCEDURE PROC_INS_UP_N_P_NO 
(
  PARAM1 IN VARCHAR2  
, PARAM2 OUT NUMBER 
) AS 
BEGIN
SELECT nvl(COUNT(*),0) INTO PARAM2
     FROM ITEMS
WHERE trim(b_no)= PARAM1;
END PROC_INS_UP_N_P_NO;
 
الكود اللى بينادى عليها
بيعطى خطأ         
  • Error(444,56): incompatible types 
    public boolean validateCHEKB_NO(String b_no) {        
        int result=0;
        int COUNTER=0;
        String PlSQLCode="{CALL PROC_INS_UP_N_P_NO (?)";   
        CallableStatement stat=null;                                       
                                   stat=getDBTransaction().createCallableStatement(PlSQLCode,getDBTransaction().DEFAULT);
                                    stat.setString(1, b_no);        
                                    result=stat.execute(); 
  
 
                                      try { 
 
                                  } catch (Exception e) {
                                      // TODO: Add catch code                                     
                                      System.out.println("eeeeeeeeeee"+e);                                      
                                      e.printStackTrace();
                                  } finally {
                                    try {
                                          stat.close();     
                                      } catch (Exception e) {
                                          // TODO: Add catch code
                                          e.printStackTrace();
                                      }  
                                     
                                  }  
                                    setbal (BigDecimal.ZERO);
                                    System.out.println(COUNTER);
                                    System.out.println("xxxxxxx"+result);
                                    System.out.println("gggggggggggg");
                                return true;  
                                }
بتاريخ:

أين السطر بالضبط الذي يعطي خطأ؟

بتاريخ:
  • كاتب الموضوع

هذا السطر

                                    result=stat.execute(); 
بتاريخ:
  • كاتب الموضوع

شكرا يا باشمهندس قمت بتصحيح الخطأ

وحاليا بعمل run للبرنامج للتأكد من صحة الكود

بعد اضافة سطر

COUNTER = stat.getInt(2);

علشان اجيب قيمة المطلوبة من جملة sql

بتاريخ:

لم أفهم

هل المشكلة قائمة أم تم حلها؟

بتاريخ:
  • كاتب الموضوع

الخطأ فى ال PROCEDURE

 

java.sql.SQLException: ORA-06550: سطر 1 ، عمود  7 : 
PLS-00306: wrong number or types of arguments in call to 'PROC_INS_UP_N_P_NO'
ORA-06550: سطر 1 ، عمود  7 : 
PL/SQL: Statement ignored
 

 

create or replace

PROCEDURE PROC_INS_UP_N_P_NO
(
  PARAM1 IN VARCHAR2  
, PARAM2 OUT NUMBER  
) AS 
BEGIN
SELECT COUNT(*) INTO PARAM2 FROM ITEMS
WHERE  trim(b_no)=trim(PARAM1);
END PROC_INS_UP_N_P_NO;
 
 
 
 
    public boolean validateCHEKB_NO(String b_no) {        
        int result=0;
        int COUNTER=0;
        String PlSQLCode="{CALL PROC_INS_UP_N_P_NO (?)";   
        CallableStatement stat;
                                   stat=null;      
                        try {          
                                   stat=getDBTransaction().createCallableStatement(PlSQLCode,getDBTransaction().DEFAULT);
                                   stat.setString(1,b_no);   
                                   result=stat.executeUpdate();
                                   COUNTER = stat.getInt(2);                                       
                                  } catch (Exception e) {
                                      // TODO: Add catch code                                     
                                      System.out.println("eeeeeeeeeee"+e);                                      
                                      e.printStackTrace();
                                  } finally {
                                    try {
                                          stat.close();     
                                      } catch (Exception e) {
                                          // TODO: Add catch code
                                          e.printStackTrace();
                                      }  
                                     
                                  }  
                        
                                    setbal (BigDecimal.ZERO);
                                    System.out.println(COUNTER);
                                    System.out.println("xxxxxxx"+result);
                                    System.out.println("gggggggggggg");
                                return true;  
                                }
بتاريخ:

أنت قمت بتغيير parameters ، أصبح هناك واحد in وواحد out

بالتالي يجب تغيير كود الاستدعاء حيث أنك قمت باستخدام نفس الكود القديم

بتاريخ:
  • كاتب الموضوع

قمت بتعديل  كود الاستدعاء على هذا النحو

 

 String PlSQLCode="{CALL PROC_INS_UP_N_P_NO (?,?)"; 

 

 

وال procedure

create or replace
PROCEDURE PROC_INS_UP_N_P_NO
(
  PARAM1 IN VARCHAR2  
, PARAM2 OUT NUMBER  
) AS 
BEGIN
SELECT COUNT(*) INTO PARAM2 FROM ITEMS
WHERE  trim(b_no)=trim(PARAM1);
END PROC_INS_UP_N_P_NO;

 

اعطانى خطأ جديد

java.sql.SQLException: معامل IN أو OUT مفقود في الفهرس:: 2
بتاريخ:
  • كاتب الموضوع

الف شكر يا باشمهندس

الكود اشتغل على هذا الوضع

 

    public boolean validateCHEKB_NO(String b_no) {        
        boolean result=true;
        int COUNTER=0;
        String PlSQLCode="{CALL PROC_INS_UP_N_P_NO (?,?)";   
        CallableStatement stat;
                                   stat=null;      
                        try {          
                                   stat=getDBTransaction().createCallableStatement(PlSQLCode,getDBTransaction().DEFAULT);
                                   stat.setString(1,b_no); 
                                   stat.registerOutParameter(2, Types.INTEGER);
                                   result=stat.execute();
                                   COUNTER = stat.getInt(2);  
                                   stat.clearParameters();
                                  } catch (Exception e) {
                                      // TODO: Add catch code                                     
                                      System.out.println("eeeeeeeeeee"+e);    
                                      System.out.println("hhhhhhhhhhh"+PlSQLCode);
                                      e.printStackTrace();
                                  } finally {
                                    try {
                                          stat.close();     
                                      } catch (Exception e) {
                                          // TODO: Add catch code
                                          e.printStackTrace();
                                      }  
                                     
                                  }  
                        if (COUNTER==0){                            
                            setbal (BigDecimal.ZERO);
                            setINS_UP_YN(0);
                            System.out.println("zzzzzzzzz"+getbal());
                        }        
                        else {
                            setINS_UP_YN(1);
                        }
                                    System.out.println(COUNTER);
                                    System.out.println("YYYYYYY"+b_no);
                                    System.out.println("xxxxxxx"+result);
                                    System.out.println("zzzzzzz"+getINS_UP_YN());
                                    System.out.println("gggggggggggg");
                                return true;  
                                }
بتاريخ:

جميل ولكن لا زلت أقول لك أنه لا داعي لاستخدام Procedure وتكفي جملة عادية

بتاريخ:
  • كاتب الموضوع

حضرتك تقصد جملة داخل ال class

ارجو التوضيح بمثال

بتاريخ:

يمكنك استخدام هذه الجملة داخل PreparedStatement 

SELECT COUNT(*) FROM ITEMS WHERE  trim(b_no)=trim(PARAM1)

راجع فيديو JDBC

SELECT COUNT(*) INTO PARAM2 FROM ITEMS
WHERE  trim(b_no)=trim(PARAM1);
END PROC_INS_UP_N_P_NO;
بتاريخ:
  • كاتب الموضوع

شكرا يا باشمهندس وضحت الفكرة

ولكن لو تكررت هذه الجمل فى اكثر من شاشة هل الافضل ان اكتبها داخل PreparedStatement كل مرة ام اعمل Procedure

وهل كثرت ال procedure خطأ على ال database

بتاريخ:

 

ولكن لو تكررت هذه الجمل فى اكثر من شاشة هل الافضل ان اكتبها داخل PreparedStatement كل مرة ام اعمل Procedure

يمكن عمل دالة بها الكود ويتم استدعاء الدالة بدلاً من كتابة الجملة في كل شاشة

 

وهل كثرت ال procedure خطأ على ال database

لا

 

بتاريخ:
  • كاتب الموضوع

استخدمت ال preparedstatment

 

بس اعطالى خطأ على جملة       ResultSet rs = statee.executeQuery();

 

وهل يمكن ان استغنى عى ال parameter  وادخل المتغيرات مسبوقة بحرف ال+

 

    public boolean validateCHEKB_NO(String b_no) {   
        
     int COUNTER  =0; 
     DCBindingContainer dcbc =  (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
     Row row =dcbc.findIteratorBinding("ProdAddView2Iterator").getCurrentRow();
      System.out.println("wwwwwwweeeeeeeeeeeee");
            if (row!=null){    
                               System.out.println("eeeeerrrrrrrrrrrrrrrr");
                                                
      String  bb_no =(String) row.getAttribute("BNo");  
      BigDecimal bbal1=(BigDecimal) row.getAttribute("BStock");
      BigDecimal bbal2=(BigDecimal) row.getAttribute("QunIn");                 
      BigDecimal bbal3=(BigDecimal) row.getAttribute("QunOut");
      BigDecimal bbal= bbal1+bbal2-bbal3;
          String sql=
                    "SELECT nvl(COUNT(*),0) INTO +COUNTER FROM ITEMS\n" + 
                    "WHERE  trim(b_no)=trim(+bb_no)";
                                                
                     PreparedStatement statee =
                     getDBTransaction().createPreparedStatement(sql, 1);
                     ResultSet rs = statee.executeQuery();
                      if (rs.next()) {
                                    
                                    
                                    } else {
                                    
                                    }
                                    } catch (SQLException sqle) {
                                    // TODO: Add catch code
                                    sqle.printStackTrace();
                                    }
                                    
                                    
        
                        if (COUNTER==0){                            
                            setbal (BigDecimal.ZERO);
                            setINS_UP_YN(0);
                            System.out.println("zzzzzzzzz"+getbal());
                        }        
                        else {
                            setINS_UP_YN(1);
                        }
                                    System.out.println(COUNTER);
                                    System.out.println("YYYYYYY"+b_no);
                                    System.out.println("xxxxxxx"+result);
                                    System.out.println("zzzzzzz"+getINS_UP_YN());
                                    System.out.println("gggggggggggg");
                                return true;  
                                }

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.