Wednesday, March 30, 2016

SQL - Context Switches and RETURNING clause

Context Switches and Performance
Almost every program PL/SQL developers write includes both PL/SQL and SQL statements. 

PL/SQL statements are run by the PL/SQL statement executor.
SQL statements are run by the SQL statement executor.

When the PL/SQL runtime engine encounters a SQL statement, it stops and passes the SQL statement over to the SQL engine.The SQL engine executes the SQL statement and returns information back to the PL/SQL engine.This transfer of control is called a context switch, and each one of these switches incurs overhead that slows down the overall performance of your programs.
With the RETURNING clause, I can reduce network round trips, consume
less server CPU time, and minimize the number of cursors opened and managed
in the application.



create or replace TYPE array_type IS VARRAY (3) OF VARCHAR2 (100);


create or replace type number_type is varray(3) of number;
Use the RETURNING clause to retrieve a value (the new salary) that was computed within the UPDATE statement.
Example
DECLAREmyname employees.last_name%TYPE;
mysal employees.salary%TYPE;
BEGIN
FOR rec IN (SELECT * FROM employees)
LOOP
UPDATE employees
SET salary = salary * 1.5
WHERE employee_id = rec.employee_id
RETURNING salary, last_name INTO mysal, myname;
DBMS_OUTPUT.PUT_LINE ('New salary for ' ||
myname || ' = ' || mysal);
END LOOP;
END;
Use the RETURNING  clause to retrieve not just into a single variable, but into collection.
Example
DECLARE
names array_type := array_type ();
names_ret array_type := array_type ();
numbers number_type := number_type();
BEGIN
names.extend(2);
names_ret.extend(2);
names(1) := 'Mahmoud';
names(2) := 'Noor';
numbers.extend(2);
numbers(1) := 100;
numbers(2) := 101;
FORALL i IN names.first..names.last
UPDATE employees SET FIRST_NAME = names(i) WHERE EMPLOYEE_ID  = numbers(i)
RETURNING FIRST_NAME BULK COLLECT INTO names_ret;
DBMS_OUTPUT.PUT_LINE(names_ret(1));
END;

http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html

Thursday, March 17, 2016

التأكد أن كل قوس مفتوح يقابله قوس مغلق

عندك مجموعة اقواس بتفتح وتقفل
عاوز اتاكد ان كل قوس اتفتح اتقفل مقابل ليه وإن القوس اتفتح في الأول
كده مثلا
((  )) ده صح
))((  ده غلط
ايه أحسن حل?
===========================

الحل اللي فكرت فيه
أول حاجة تتأكد ان عدد الأقواس زوجي
انك تعد عدد الأقواس وتقسم على 2 لانه هيبقى عدد زوجي المفروض ان باقي القسمة يساوي صفر
وتتأكد إن كل الأقواس من الأول لغاية النص تتأكد انها مفتوحة ومن 
 بعد النص للاخر مقفولة
يعني

  عدد الأقواس زوجي
 والأقواس مفتوحة في البداية  من جهة اليسار  ومقفولة في الجهة المقابلة جهة اليمين 


public static boolean checkValid(String seq){
        for (int i = 0; i<seq.length()/2; i++) {
           if(seq.charAt(i) != '(' && seq.charAt(seq.length()-1-i) != ')'){
               return false;
           }
        }
        return true;
    }

 ( ( )(  ) )   طيب لو ده مثلا افترضنا إنه صحيح

 المفروض انه صح لكن الدالة السابقة هتطلعه غلط  عشان الحرف الثالث مقفول والرابع مفتوح

يبقى الحل
1- عدد الأقواس زوجي
 وعدد الأقواس المفتوحة يساوس عدد الأقواس القفولة
2- القوس الأول مقفول
3- القوس الأخير مقفول

لكن ده         ()  )(  ( )
غلط وهيطلع بالحل ده صح
  

الحل
1- عدد الأقواس زوجي
 وعدد الأقواس المفتوحة يساوس عدد الأقواس القفولة
2- القوس الأول مقفول
3- القوس الأخير مقفول
4- تلف على ال Sting
وتعمل عدادين
كل لما تلاقي قوس مفتوح تزود واحد في العداد الأول
تلاقي قوس مقفول تزود واحد في العداد الثاني
بشرط ان العداد الثاني ميزيدش عن العداد الأول في كل مرة يعني ميكنش قوس اتقفل قفل ما يكون اتفتح

حل تاني أسهل باستخدام
  data structure
وهي ال
 stack 
انك لو لقيت قوس مفتوح تدخله
push
لو اتقفل تشيل اول قوس كان مفتوح منها يعني تعمل
 بشرط ان ال  pop
stack
متكونش فضيت
في الاخر لو ال
stack
فضيت يبقى الأقواس مضبوطة
    public static boolean checkValid2(String seq) {
        Stack st = new Stack();
        for (int i = 0; i < seq.length(); i++) {
            if (seq.charAt(i) == '(') {
                st.push(seq.charAt(i));
            } else {
                if (!st.isEmpty()) {
                    st.pop();
                } else {
                    return false;
                }
            }
        }
        if (st.size() > 0) {
            return false;
        }
        return true;
    }

java - fill distinct objects in ArrayList

If you have a list that contains some objects that it is considered as duplication when two or three fields of these objects are equal. How ...