Προς το περιεχόμενο

Διαφορά μεταξύ τύπων function στην Oracle;


bnvdarklord

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα

 

Κανω μια εργασία στην oracle και διαφάζω απο τις σημειώσεις του καθηγητή, και έχει τα εξής είδη function:

map member function

member function

και order member function

 

χωρις να εξηγει τι διαφορές έχουν. Εχω ψαξει στο internet αλλα δεν βρήκα πολλά πραγματα.

 

Ευχαριστώ :-D

Δημοσ.

Και οι τρεις τύποι function έχουν να κάνουν με Object Oriented Programming σε PL/SQL.

Οι MEMBER FUNCTION είναι οι απλές function που έχουν κάποιες λειτουργίες μέσα στο αντικείμενο.

 

Η MAP MEMBER FUNCTION (ενικός γιατί μπορείς να έχεις μόνο μία σε κάθε αντικείμενο) χρησιμοποιείται από την PL/SQL για να ταξινομείς τα αντικείμενά σου (δεδομένου ότι δεν είναι standard type δεν ξέρει πως να τα ταξινομήσει για αυτό πρέπει να του το πεις εσύ). Αυτό που κάνει είναι να επιστρέφει από το αντικείμενό σου, έναν τύπο δεδομένων τον οποίο μπορεί να αναγνωρίσει ώστε να κάνει ταξινόμηση.

 

Η ORDER MEMBER FUNCTION χρησιμοποιείται για τον ίδιο λόγο με την MAP με την διαφορά όμως ότι παίρνει σαν όρισμα ένα αντικείμενο και το συγκρίνει με το υπάρχον και επιστρέφει 0 αν θεωρούνται ίσα, έναν θετικό αν το όρισμα είναι μικρότερο από το ίδιο και έναν αρνητικό αν το όρισμα είναι μεγαλύτερο από το ίδιο το αντικείμενο.

 

Για περισσότερες πληροφορίες και παραδείγματα δες εδώ. (Αν κάνεις μία αναζήτηση για MAP MEMBER FUNCTION θα βρεις την παράγραφο που τα εξηγεί.)

Δημοσ.

Η διαφορά είναι η εξής

 

Οι member functions είναι όπως είναι οι μέθοδοι σε άλλες γλώσσες. Δηλαδη ορίζεις τις μεθόδους του αντικειμένου.

 

Οι map | sort functions χρησιμοποιούνται για equality λόγους. Η Oracle όταν προσπαθείς να συγκρίνεις δύο αντικέμενα θεωρεί ότι είναι ίδια αν όλα τα member variables είναι ίδια και φυσικά δεν είναι null. Επομένως όταν υλοποιείς user defines objects και δεν έχεις κάποια map ή sort function μπορείς να φτάσεις μόνο μέχρι συγκρίσεις object_1=object_2 και object_3!=object_4 και μόνο σε SQL. Τι γίνεται όμως όταν θέλεις να έχεις συγκρίσεις τύπου <=, < , >, >= ή θέλεις να χρησιμοποιήσεις order by ? Εκεί έρχονται οι map order member functions.

 

Μπορείς να ορίσεις μόνο μία σε κάθε user defined type. Στην ουσία στην map member function βάζεις την δική σου λογική και επιστρέφεις μια scalar μεταβλητη. Δηλαδή αν ας πούμε έχουμε το ακόλουθο

 

>CREATE OR REPLACE TYPE  aztec
AS OBJECT
(
   aztec1         NUMBER (10),
   aztec2         NUMBER (10),
   MAP MEMBER FUNCTION  to_div
       RETURN NUMBER
);

CREATE OR REPLACE TYPE BODY  aztec
AS

MAP MEMBER FUNCTION  to_div
RETURN NUMBER
IS
   ret_aztec  number(10);
BEGIN
   
    ret_aztec:=SELF.aztec1/SELF.aztec2;
    return ret_aztec;
END   

END;

 

Τι μας λέει στην ουσία εδώ. Ας πούμε ότι έχουμε τα object a1 και α2 τύπου Aztec. Πλέον η σύγκριση δεν θα είναι μεταξύ των member variables αλλά όταν θα γράψουμε a1>a2(πλέον μπορούμε) η oracle θα το εκλάβει ως a1.to_div()>a2.to_div().

 

 

Στην ουσία συνοπτικά κάνεις override το compare της oracle μεταξύ αντικειμένων, υλοποιείς ένα δικό σου κάτι που είναι απαραίτητο αν δεν σε ενδιαφέρουν μονο οι τελεστες (=|!=) για τα κατ αντιστοιχία member variables.

 

Τα ίδια σου δίνει και η order απλά έχει μια διαφοερτική λογική υλοποίησης. Για αυτό μπορείς να υιοθετήσεις μόνο την μία.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...