الانتقال إلى المحتوى

مساعدة فى : Package and Triggers


Ricardo Quaresma

Recommended Posts

أولاً : انا بأعتذر عن التأخير ، بس صدقاً ظروف الشغل بأه
ثانياً : انا كنت جاي النهارده وعارف ان الشغل خفيف وواخد قرار اني اخلص الامتحان ، بس واضح كده ان الدنيا بدأت تزنق تاني في الشغل ، انا كنت ناوي اخلص السؤال الثالث والرابع وابعتهم ، لكن فعلا لاني حاسس اني مش متحكم في وقتي وكمان مش عارف هكون فاضي باقي اليوم ولا لأ ، انا خلصت السؤال الرابع كله وقولت ابعتهولك عشان ما تتعطلش اكتر من كده ، ولو ربنا قدرني وكان فيه وقت ولحقت اخلص الثالث النهارده هبعته
ده البكتج المطلوبة .... بس ياريت تتأكد منها ، انا جربتها كلها والحمد لله تمام ، بس برضه اتأكد

CREATE OR REPLACE PACKAGE sql_pkg
IS
  TYPE invdtls_rec IS RECORD (
     invid       invdtls.invid%TYPE,
     prdid       invdtls.prdid%TYPE,
     unitprice   invdtls.unitprice%TYPE,
     qntity      invdtls.qntity%TYPE,
     discntd     invdtls.discntd%TYPE
  );

  TYPE invdtls_tab IS TABLE OF invdtls_rec
     INDEX BY BINARY_INTEGER;

  PROCEDURE insert_invdtl_rec (p_rec invdtls_rec);

  PROCEDURE trans_data (p_invid invdtls.invid%TYPE);

  FUNCTION get_total_bill (p_invid NUMBER)
     RETURN NUMBER;

  PROCEDURE print_inv_inf;
END sql_pkg;
/



********************************************************************************
**********************************************

وده الBODY


CREATE OR REPLACE PACKAGE BODY sql_pkg
IS
  inv_tbl   invdtls_tab;

  PROCEDURE insert_invdtl_rec (p_rec invdtls_rec)
  IS
     v_rec   invdtls_rec;
  BEGIN v_rec.invid := p_rec.invid;
     v_rec.prdid := p_rec.prdid;
     v_rec.unitprice := p_rec.unitprice;
     v_rec.qntity := p_rec.qntity;
     v_rec.discntd := p_rec.discntd;
     inv_tbl (v_rec.invid) := v_rec;
  END insert_invdtl_rec;

--************************************************************
  PROCEDURE trans_data (p_invid invdtls.invid%TYPE)
  IS
  BEGIN IF inv_tbl.EXISTS (p_invid)
     THEN
        INSERT INTO invdtls VALUES (inv_tbl (p_invid).invid, inv_tbl (p_invid).prdid,
                     inv_tbl (p_invid).unitprice, inv_tbl (p_invid).qntity,
                     inv_tbl (p_invid).discntd);

        inv_tbl.DELETE (p_invid);
     ELSE
        DBMS_OUTPUT.put_line ('NO INVID MATCH YOUR ASSIGN PARAMETER');
     END IF;
  END trans_data;

--*******************************************************************
  FUNCTION get_total_bill (p_invid NUMBER)
     RETURN NUMBER
  IS
     v_total   NUMBER;
  BEGIN IF p_invid IS NULL
     THEN
        RETURN NULL;
     END IF;

     SELECT SUM (ID.unitprice * ID.qntity) - SUM (i.discntv + ID.discntd)
       INTO v_total FROM invdtls ID, invoices i
      WHERE ID.invid = i.invid AND i.invid = p_invid;

     RETURN (v_total);
  EXCEPTION
     WHEN NO_DATA_FOUND
     THEN
        RETURN NULL;
  END get_total_bill;

--**************************************************************
  PROCEDURE print_inv_inf
  IS
     CURSOR inv_cur
     IS
        SELECT i.invid, i.invdate, i.state
          FROM invoices i;

     CURSOR invdt_cur (v_invid invoices.invid%TYPE)
     IS
        SELECT p.prodname, (ID.qntity * ID.unitprice) quntity_price
          FROM invdtls ID, prdcts p
         WHERE ID.prdid = p.prdid AND ID.invid = v_invid;

     v_inv_price   NUMBER := 0;
     v_total       NUMBER := 0;
  BEGIN FOR n IN inv_cur
     LOOP
        DBMS_OUTPUT.put_line
                 ('........................................................');
        DBMS_OUTPUT.put_line (   'INVID: '
                              || n.invid
                              || '  INVDATE: '
                              || n.invdate
                              || '  INV STATE :  '
                              || n.state
                             );
        DBMS_OUTPUT.put_line
                 ('---------------------------------------------------------');

        FOR i IN invdt_cur (n.invid)
        LOOP
           v_inv_price := v_inv_price + i.quntity_price;
           DBMS_OUTPUT.put_line (   'PRODNAME: '
                                 || i.prodname
                                 || '  QUNTITY_PRICE: '
                                 || i.quntity_price
                                );
        END LOOP;

        DBMS_OUTPUT.put_line
                  ('........................................................');
        DBMS_OUTPUT.put_line (   ' TOTAL PRICE OF INVOICE NUMBER '
                              || n.invid
                              || ' = '
                              || v_inv_price
                             );

        IF n.state = 'IN'
        THEN
           v_total := v_total - v_inv_price;
        ELSE
           v_total := v_total + v_inv_price;
        END IF;

        v_inv_price := 0;
     END LOOP;

     DBMS_OUTPUT.put_line
                  ('........................................................');
     DBMS_OUTPUT.put_line (' TOTAL PRICE =  ' || v_total);
  END print_inv_inf;
END sql_pkg;
/

تم تعديل بواسطة abdu1_far
رابط هذا التعليق
شارك

  • الردود 25
  • البداية
  • اخر رد

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

  • Ricardo Quaresma

    12

  • abdu1_far

    9

  • mustafagamiel

    4

  • hanyfreedom

    1

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

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

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

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل



×
×
  • أضف...

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

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