#

AJAX Callback Polling Pattern στο Oracle APEX

ΤΕΧΝΙΚΟ ΦΥΛΛΑΔΙΟ

AJAX Polling Pattern στο Oracle APEX

Αυτόματη Ανανέωση Δεδομένων σε Real-Time

1. Εισαγωγή

Το παρόν τεχνικό φυλλάδιο περιγράφει την υλοποίηση ενός AJAX Polling pattern στο Oracle APEX για την αυτόματη ανανέωση δεδομένων όταν αυτά αλλάζουν στη βάση δεδομένων από άλλο σημείο της εφαρμογής.

Το pattern αυτό είναι ιδανικό για περιπτώσεις όπου πολλαπλοί χρήστες εργάζονται στην ίδια εφαρμογή και χρειάζεται real-time ενημέρωση χωρίς manual refresh της σελίδας, αλλά και στην περίπτωση που ο ίδιος χρήστης αλλάξει τα δεδομένα σε άλλο tab που είναι ανοιχτή αυτή ή εφαρμογή

2. Δομή Βάσης Δεδομένων

Η υλοποίηση βασίζεται σε δύο πίνακες:

2.1 Πίνακας AJAX_TEST

Αποθηκεύει τον αριθμό (TEST_NUMBER) που σχετίζεται με κάθε χρήστη. Το πεδίο TEST_USER είναι Primary Key.

Πεδίο Τύπος Περιγραφή
TEST_USER VARCHAR2(233) Username (PK, NOT NULL)
TEST_NUMBER NUMBER Αριθμός χρήστη (NOT NULL)


 

2.2 Πίνακας AJAX_TEST_DATA

Αποθηκεύει τα δεδομένα που σχετίζονται με κάθε αριθμό. Συνδέεται με τον AJAX_TEST μέσω του AJAX_NUMBER.

Πεδίο Τύπος Περιγραφή
AJAX_NUMBER NUMBER FK προς TEST_NUMBER
AJAX_DATA VARCHAR2(244) Δεδομένα εγγραφής


 

2.3 DDL Scripts

CREATE TABLE AJAX_TEST (

TEST_USER VARCHAR2(233 CHAR) NOT NULL,

TEST_NUMBER NUMBER NOT NULL,

CONSTRAINT AJAX_TEST_PK PRIMARY KEY (TEST_USER)

);

 

CREATE TABLE AJAX_TEST_DATA (

AJAX_NUMBER NUMBER,

AJAX_DATA VARCHAR2(244 CHAR)

);

3. Αρχιτεκτονική Λύσης

3.2 Περιγραφή Λειτουργίας

  1. Ο χρήστης ανοίγει τη σελίδα
  2. Η JavaScript function checkForUpdates() καλείται αμέσως και μετά κάθε 5 δευτερόλεπτα
  3. Η function στέλνει AJAX request στο GET_MY_NUMBER callback
  4. Το callback διαβάζει την τρέχουσα τιμή από τη βάση
  5. Αν η τιμή διαφέρει από την τρέχουσα, ενημερώνεται το item και γίνεται refresh το IR

4. Υλοποίηση στο Oracle APEX

4.1 Δημιουργία Page Item

Δημιουργήστε το item P1_MY_NUMBER με τις εξής ρυθμίσεις:

  • Type: Hidden

  • Source: SQL Query (return single value)

SQL Query (για αρχική τιμή):

SELECT TEST_NUMBER

FROM AJAX_TEST

WHERE TEST_USER = :APP_USER

4.2 Δημιουργία Interactive Report

Δημιουργήστε ένα Interactive Report με τις εξής ρυθμίσεις:

  • Static ID: my_ir_static_id

  • Source → Page Items to Submit: P1_MY_NUMBER

SQL Query:

SELECT AJAX_NUMBER,

AJAX_DATA

FROM AJAX_TEST_DATA

WHERE AJAX_NUMBER = :P1_MY_NUMBER

4.3 Ajax Callback Process

Δημιουργήστε ένα Process στη σελίδα με τα εξής:

  • Name: GET_MY_NUMBER

  • Type: Ajax Callback

PL/SQL Code:

DECLARE

l_number NUMBER;

BEGIN

SELECT TEST_NUMBER

INTO l_number

FROM AJAX_TEST

WHERE TEST_USER = :APP_USER;

 

apex_json.open_object;

apex_json.write('myNumber', l_number);

apex_json.close_object;

EXCEPTION

WHEN NO_DATA_FOUND THEN

apex_json.open_object;

apex_json.write('myNumber', '');

apex_json.close_object;

END;

4.4 JavaScript Code

Στο Page Attributes → JavaScript → Function and Global Variable Declaration:

var pollInterval;

 

function checkForUpdates() {

apex.server.process('GET_MY_NUMBER', {}, {

dataType: 'json',

success: function(data) {

var currentValue = apex.item('P1_MY_NUMBER').getValue();

var newValue = data.myNumber;

 

// Αν άλλαξε η τιμή, ενημέρωσε item και IR

if (currentValue != newValue) {

apex.item('P1_MY_NUMBER').setValue(newValue);

apex.region('my_ir_static_id').refresh();

}

}

});

}


 

Στο Execute when Page Loads:

// Έλεγχος κάθε 5 δευτερόλεπτα

pollInterval = setInterval(checkForUpdates, 5000);

 

// Αρχικό φόρτωμα

checkForUpdates();

5. Προχωρημένες Ρυθμίσεις

5.1 Βελτιστοποίηση Polling

Για μείωση του φόρτου, μπορείτε να σταματάτε το polling όταν η σελίδα δεν είναι ορατή:

// Stop polling όταν η σελίδα χάνει focus

document.addEventListener('visibilitychange', function() {

if (document.hidden) {

clearInterval(pollInterval);

} else {

pollInterval = setInterval(checkForUpdates, 5000);

checkForUpdates(); // Άμεσος έλεγχος

}

});

5.2 Visual Feedback

Προσθέστε ειδοποίηση όταν ανιχνεύεται αλλαγή:

if (currentValue != newValue) {

apex.item('P1_MY_NUMBER').setValue(newValue);

apex.region('my_ir_static_id').refresh();

 

// Εμφάνιση notification

apex.message.showPageSuccess(

'Τα δεδομένα ενημερώθηκαν αυτόματα'

);

}

5.3 Error Handling

Προσθέστε διαχείριση σφαλμάτων στο AJAX call:

apex.server.process('GET_MY_NUMBER', {}, {

dataType: 'json',

success: function(data) {

// ... κώδικας επιτυχίας

},

error: function(xhr, status, error) {

console.error('Polling error:', error);

// Προαιρετικά: σταματήστε το polling μετά από πολλά σφάλματα

}

});

6. Σημαντικές Παρατηρήσεις

6.1 Performance

  • Το polling interval (5000ms) μπορεί να αυξηθεί για μείωση φόρτου

  • Κάθε poll δημιουργεί ένα HTTP request και ένα database query

     

6.2 Ασφάλεια

  • Το :APP_USER διασφαλίζει ότι κάθε χρήστης βλέπει μόνο τα δικά του δεδομένα

  • Τα Ajax Callbacks εκτελούνται με τα ίδια session privileges



 

7. Σύνοψη

Η υλοποίηση AJAX Polling στο Oracle APEX προσφέρει έναν απλό και αποτελεσματικό τρόπο για αυτόματη ανανέωση δεδομένων. Τα βασικά στοιχεία είναι: ένα Ajax Callback που επιστρέφει την τρέχουσα τιμή σε JSON, JavaScript με setInterval για περιοδικό έλεγχο, σύγκριση τιμών και ενημέρωση μόνο όταν υπάρχει αλλαγή, και refresh του Interactive Report με τη νέα τιμή.


 


https://e-schema.gr