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 Περιγραφή Λειτουργίας
- Ο χρήστης ανοίγει τη σελίδα
- Η JavaScript function checkForUpdates() καλείται αμέσως και μετά κάθε 5 δευτερόλεπτα
- Η function στέλνει AJAX request στο GET_MY_NUMBER callback
- Το callback διαβάζει την τρέχουσα τιμή από τη βάση
- Αν η τιμή διαφέρει από την τρέχουσα, ενημερώνεται το 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

