
Tworzenie linków w Oracle Apex
Oracle Apex posiada mechanizmy bezpieczeństwa które nie pozwalają na łatwe skomponowanie linku który przeniesie nas do rządanej strony w aplikacji. Jest to zabezpieczenie przed tak zwanym "URL tampering". By taki link zadziałał nie wystarczy skleić go wstawiając adres serwera, numer strony, sesje i parametry strony. Oracle Apex wylicza checksums linku specjalnym algorytmem. Zatem jeśli spróbujesz zrobić coś jak "f?p=&APP_ID.:175:&SESSION.:COS::RIR,CIR:IRIN_PARAM:\000040, 000023\" to po prostu nie zadziała. Choć nadal w Google znajdziesz wiele błedny tutoriali że jest inaczej.
Jak zatem tworzyć linki? Poniżej dwa najwygodniejsze sposoby.
Utworzenie linku w procedurze PL/SQL i zwrócenie go jako kolumna
Taka potrzeba pojawia się często przy warunkowym linku; jeśli coś tam to dokądś tam, jeśli inne coś to w inne miejsce...
CASE
WHEN pr.some_column is NULL THEN
'f?p=&APP_ID.:150:&SESSION.:OFFE::RIR,CIR'
ELSE 'f?p=&APP_ID.:150:&SESSION.:OFFE::RIR,CIR:IR_DETAILS:'||lpad(to_char(pr.marker),6,'000000')
END edit_link
Deadlock, Database is locked
SQLITE_BUSY
W artykule SQLite jako baza danych tranformacji Pentaho opisywaliśmy jak użyteczna jest to baza danych. Minmalistyczna, wszystko zawarte w jednym pliku, bardzo szybka. Ale baza ta potrafi miec czkawki przy wiekszej ilosci danych. Nawet jeśli program który jej używa zamyka połączenia (Pentaho robi to domyślnie), sama baza jest nadal zajęta sobą i nie reaguje na czas. Żadne żonglowanie ilością sesji, ilością połączeń tutaj nie pomoże. W efekcie wywołanie następnego połączenia do tabeli/bazy powoduje komunikat SQLException: [SQLITE_BUSY] The database file is locked (database is locked)... lub podobny.
Zauważyć to można np. przy kasowaniu dużej ilości danych z tabeli. Zatem należy unikać takich operacji jeśli mamy wiele rekordów w tabeli (dziesiątki, setki tysięcy...). Co prawda baza SQLite przy wykonywaniu DELETE FROM table używa "TRUNCATE optimizera" ale rezultat jest kiepski. Rozwiązaniem może być użycie DROP TABLE i utworzenie tabeli na nowo.
Dodatkowe zalecenie to większe odstępy czasowe między komendami które wykonują operacje na bazie danych.

Oracle Apex - Wykonywanie procedury PL/SQL z poziomu JavaScript
Czasami w aplikacji web zachodzi konieczność połaczenia informacji pobranych z bazy z tymi które właśnie wprowadza użytkownik. Pełnego zestawu potrzebnych informacji nie ma ani w bazie, ani w formularzu użytkownika - trzeba te części połączyć.
To co jest po stronie klienta, w przeglądarce, najlepiej odczytać używając JavaScript. To co jest w tabeli, pisząc kod PL/SQL. Jak to połączyć? Używając metody AJAX. Za wikipedia:
Asynchroniczny JavaScript i XML (Asynchronous JavaScript and XML, AJAX) – technika tworzenia aplikacji internetowych, w których interakcja użytkownika z serwerem odbywa się bez przeładowywania całego dokumentu, w sposób asynchroniczny. Ma to umożliwiać bardziej dynamiczną interakcję z użytkownikiem niż w tradycyjnym modelu, w którym każde żądanie nowych danych wiąże się z przesłaniem całej strony HTML.
Oracle Apex interactive grid i dynamiczne sumowanie kolum
Czasami w projekcie, w widoku inteactive grid mamy potrzebę dynamicznego podsumowania wartości wszystkich wierszy w kolumnie (np. by obliczyć wartość faktury) lub wykonania operacji przeliczenia wszystkich składników dokumentu jeśli zmienimy którekolwiek pole w formularzu. Gdyby była to wspomniana wcześniej faktura to np. po zmienie lilości w którymkolwiek wierszu potrzebowalibyśmy obliczyć wartość total tego wiersza na nowo i dokonać wyliczenia podatku, sumy netto i brutto całej faktury.
API apex.region zapewnia pojedynczy interfejs dla wszystkich popularnych funkcji Application Express związanych z regionami. Ten interfejs API zwraca obiekt regionu Application Express, który jest używany do uzyskiwania dostępu do funkcji i właściwości związanych z regionem.
Za pomocą tego API (JavaScript) możemy odczytywać wartość pól i je modyfikować.
Opiszemy przykład który zademonstruje jak zliczyć wartość wszystkich wierszy kolumny i jak wyliczyć wartość jednej z kolumn na podstawie wartości odczytanych z dwóch innych kolumn, dla każdego wiersza.