Presentation is loading. Please wait.

Presentation is loading. Please wait.

Advanced Application Express Tips and Techniques

Similar presentations


Presentation on theme: "Advanced Application Express Tips and Techniques"— Presentation transcript:

1 Advanced Application Express Tips and Techniques
By Bradley D. Brown, TUSC, CTO Oracle Certified Advantage Partner

2 Bradley D. Brown http://bradleydbrown.blogspot.com
TUSC Founder, Author, Chief Technology Officer University of Denver Graduate Class – New Venture Creation Clients IntelliReal, OAB, EventConnex, Jepp, Sun, … Groups YPO, OOW, IOUG, ODTUG, LAOUG, RMOUG, etc. Oracle Fusion Middleware Director/Ace IOUC Fusion Council

3 Topics HTML ApEx ApEx PL/SQL JavaScript Favorite Icon Pop-ups
Tool tips Anchors ApEx Page 0 Help text / page Custom login page Highlighting Current Record Document Management Outlook Integration PL/SQL Complex searches Function-based queries Background jobs JavaScript Setting focus AJAX Netflix Flyups Google Maps

4 Everything is in the sample app Download from www.tusc.com

5 HTML ApEx Tips Pop-ups Favorite Icon Anchors Tool tips

6 Favorite Icon Place favicon2.ico file in In Page template
$ORACLE_HOME\Apache\Apache\htdocs In Page template <link rel="shortcut icon" href="/favicon2.ico" type="image/x-icon" />

7 Pop-up windows Pop-up Window Target=“_blank” in “Link Attributes”
Go to custom popups, pop-up reference window region at bottom – click on person or address from thread on passing back values from popup to opener document --create a hidden item on page 1 called P1_NEW_VALUE --create your text field on page 2. let's call it P2_DNAME --add a javascript function to page 2 that looks like this... <script language="JavaScript"> function passBackAndSubmit() { opener.document.getElementById("P1_NEW_VALUE").value = document.getElementById("P2_DNAME").value; opener.document.wwv_flow.p_request.value = 'INSERTFROMPOP'; opener.document.wwv_flow.submit(); close(); } </script> --add a button on page 2 that does a redirect to this URL... javascript:passBackAndSubmit(); --add a conditional process on page 1 that inserts :P1_NEW_VALUE into Dept when :REQUEST = 'INSERTFROMPOP' --add a branch on page 1 to branch back to page 1 when :REQUEST = 'INSERTFROMPOP' and that's it. when page 1 reloads, you'll see your newly inserted value in your Dept report. anton's laid out our approach pretty darn well, so now you're up to two options. btw, you can learn more about using javascript in your htmldb apps from this howto docuement... ...and you can learn how to do some of this htmldb popup window stuff from this one... ...hope this helps, raj

8 “Bubble-Help,” “Tool tip” or hints
Title attribute in “Link Attributes” Title="#COMMENTS#" See the highlight current page

9 Anchors See “Long Page” in sample app
Anchors can provide direct links to places on a page Set an anchor anywhere on the page <a name="Location"> Reference an anchor anywhere <a href="#Location"> jump to location</a> Best practice in page template is to include at the top of the body section <a name="Top"> This way you can place a “return to top” link anywhere on the page <a href=#Top><img src="/i/themes/theme_8/blue_arrow_up.gif" alt=“Top of page" title=“Top of page"></a> See “Long Page” in sample app

10 Application Express Tips
Page 0 Help text / page Custom login page Highlighting Current Record Document Management Outlook Integration

11 Page 0 Anything placed on Page 0 will appear on every page by default
Can use “Conditional display” to turn region on or off for specific pages, users, etc. Turn on the page 0 region and check it out

12 Help text Page level help text Item level help text
Create a table HELP_TEXT with help for each page Spell check your help text Create a new blank page Add a new region to the page “Help Text” Could also have conditional HTML sections Add an item to your navigation bar (i.e. Help) Branch to your “help text page” (i.e. 10) Pass &APP_PAGE_ID to P10_PAGE_ID Item level help text Open any page item Enter help text for the item Larry has a better way to do this, which is defined in the book

13 Custom Logon Page You can create your own logon page for any application You can use Oracle Application Express’s built-in authentication or you can use any existing scheme you have Good document on creating a custom logon page:

14 Highlight Current Note highlighting of current row
Master, master, detail Highlight current tab

15 Key Elements SQL Report Regions Hidden Items to implement details
Link to select current master record Detail SQL Query limited by “selected” master row Hidden Items to implement details Custom Templates to highlight current row Variation on alternating color report template PL/SQL expression condition for “selected” row

16 SQL Report Regions Decode primary key against hidden item for “selected” master row select decode(customer_id, :P1_CUST_ID, 'CURRENT', 'Select') sel_label, customer_id, cust_last_name||', '|| cust_first_name as cust_name, cust_street_address1||'<br>'|| Cust_city||', '|| cust_state|| ' '||cust_postal_code address from demo_customers The Oracle Experts

17 Custom Template Hidden item used in PL/SQL expression to determine “Selected” row Based off of current themes alternating row report template The Oracle Experts

18 Document management, indexing and searching
Documents will be stored in Oracle Application Express schema See Sample Application for great code examples Create a table to store the link to the documents Create table person_document (PERSON_ID number, DOCUMENT_ID number DESCRIPTION varchar2(4000), DOCUMENT varchar2(4000)) You don't have to set the mime encoding. Just drop an item on the page of type: File Browse... Incorporating this widget in a form, will cause files to be automatically uploaded. You'll be able to access them using the view wwv_flow_files. There is an api you can use to construct a download link. You could use the following query in a report: select id, name from wwv_flow_files Then, to make the first column a link, edit its properties and put the following in the HTML expression field: <a href="p?n=#ID#">#NAME#</a> Note that "p" is the name of the download procedure. P has the following signature: PROCEDURE P( n IN VARCHAR2 DEFAULT NULL, p_mime_type IN VARCHAR2 DEFAULT NULL ) So, in this link we're constructing, we only pass in the N parameter, which is the ID of the uploaded file in the wwv_flow_files view. '<img src="wwv_flow_file_mgr.get_file?p_id='||:p6_topic_image||'" >' Lots of info in forum thread How To doc on file upload download (also includes storing in your own table) good thread on moving file from wwv_flow_files to another table then downloading them files are stored by security group id, which ids the workspace select wwv_flow.get_sgid from dual in htmldb sql workshop to get sgid, returns something like to set sgid in sql-plus begin wwv_flow_api.set_security_group_id(p_security_group_id=> ); End; then you can select from wwv_flow_files select to_char(id), flow_id, name, filename, title, mime_type, doc_size, dad_charset, created_by, created_on, updated_by, updated_on, last_updated, content_type, language, description, file_type, file_charset for UDOT import of files created logon trigger to set SGID so it is set for the user in sql loader, otherwise the images go into wwv_flow_files, but you can't reference them. create control file file:\\C:\Larry\DataFiles\tusc\Clients\UDOT\Scripts\sql_loader_control.ctl create datafile file:\\C:\Larry\DataFiles\tusc\Clients\UDOT\Scripts\file_list1.dat run sql loader from file directory, sqlldr control=sqlctl.ctl log=sqlldr.log See Oracle Database Utilities manual for more on sql loader Manually create CSV for download On a blank page in an after footer process htp.init; -- Wipe out the buffer owa_util.mime_header ('application/excel',false); htp.p('Content-Disposition: attachment; filename="FormResults.csv"'); owa_util.http_header_close; -- write out the column names for it in col_cur loop v_line := v_line||it.column_name||','; end loop; --write out each row for it in sets_cur loop v_line := it.result_index||','; for r in result_cur(it.result_index) loop v_line := v_line||r.rfield_value||','; htp.print ( v_line ); end; UDOTs process of loading images -- 1. determin SIG for workspace in which you are going to load the file -- by executing this query in Oracle Application Express SQL Workshop -- 2. create a logon trigger for the user that will be used with sqlldr to load the files CREATE OR REPLACE TRIGGER tusc.set_sgid after logon on database when (upper(user) in ('TUSC' )) BEGIN wwv_flow_api.set_security_group_id(p_security_group_id=> ); END; -- now when logged in through sql plus that user could execute the following -- and get result. (you don't need to do this) select count(*) from wwv_flow_files order by id -- 3. Create the DAT file with the following query select to_char(file_index), 0, to_char(file_index)||'\'||file_name, 'C:\Larry\DataFiles\tusc\Clients\UDOT\UCON Source Code\files\'|| substr(to_char(file_index),1,4)||'\'||substr(to_char(file_index),5,2)|| '\'||to_char(file_index) ext_fname, file_name,file_mimetype, file_size, 'ascii', 'BLOB','' from files where substr(to_char(file_index),1,4) = '2005' -- 4. Edit the file to remove the null from the end of the line -- 5. Edit the CTL file to change name of DAT file control file file:\\C:\Larry\DataFiles\tusc\Clients\UDOT\Scripts\sqlctl.ctl -- 6. execute the following command from a dos prompt in the directory where the DAT and CTL file reside sqlldr control=sqlctl.ctl log=sqllog.log

19 Show a link to the document (if there is one – otherwise, create new)
Link is to p?n=document_number select DESCRIPTION, decode(document, null, '<a href="f?p=' || :app_id || ':11:::::p11_person_id,p11_document_id:' || person_id || ',' || document_id || '">Upload Supporting Document</a>', '<a href="p?n=' || document || '">Download Document</a>') document from PERSON_DOCUMENT where person_id = :p1_id

20 Best Practices and Indexing Documents
If you… Might want to port your application Have many documents Desire to index document content Create your own document table Create table resumes as select * from apex_application_files Where… Easier to export an application (and data) – otherwise, it’s in Apex schema

21 Mass Upload of Documents
Create placeholder CREATE TABLE TEMP_RESUMES (NAME VARCHAR2(90), BLOB_CONTENT BLOB) Start with directory Dir /b >resume.ctl Add SQL*Loader text above list Sqlldr user/pass control=docs.ctl load data infile * into table resumes fields terminated by ',’ (file_name char(50), blob_content lobfile(file_name) terminated by eof) BEGINDATA a.doc b.doc…

22 Load up Resumes from Temp_Resumes
INSERT INTO RESUMES SELECT ROWNUM ID, 0 flow_id, NAME NAME, NAME filename, NULL title, CASE WHEN SUBSTR(NAME,LENGTH(NAME)-3+1) = 'doc' THEN 'application/msword‘ WHEN SUBSTR(NAME,LENGTH(NAME)-3+1) = 'pdf' THEN 'application/pdf’ WHEN SUBSTR(NAME,LENGTH(NAME)-3+1) IN ('csv','xls') THEN 'application/vnd.ms-excel’ WHEN SUBSTR(NAME,LENGTH(NAME)-3+1) = 'gif' THEN 'image/gif’ WHEN SUBSTR(NAME,LENGTH(NAME)-3+1) = 'png' THEN 'image/png’ WHEN SUBSTR(NAME,LENGTH(NAME)-3+1) = 'jpg' THEN 'image/pjpeg’ ELSE 'application/text’ END mime_type, LENGTH(blob_content) doc_size, 'ascii' dad_charset, created_by, SYSDATE created_on, updated_by, SYSDATE updated_on, SYSDATE last_updated, 'BLOB' content_type, blob_content, NULL LANGUAGE, 'Loaded by BDB in bulk' description, NULL file_type, NULL file_charset FROM TEMP_RESUMES

23 Loading Documents Need a process to move document after upload
See INSERT INTO resumes(id,flow_id,name,filename,mime_type,doc_size,dad_charset,created_by,created_on,updated_by,updated_on,last_updated,content_type,blob_content,description) SELECT id,flow_id,name,filename,mime_type,doc_size,dad_charset,created_by,created_on,updated_by,updated_on,last_updated,content_type,blob_content,:P20_DESCRIPTION FROM APEX_APPLICATION_FILES WHERE name = :P1_FILE_NAME; DELETE from APEX_APPLICATION_FILES WHERE name = :P1_FILE_NAME;

24 Need Procedure to Download Document
CREATE OR REPLACE PROCEDURE download_my_file(p_file in number) AS v_mime VARCHAR2(48); v_length NUMBER; v_file_name VARCHAR2(2000); Lob_loc BLOB; BEGIN SELECT MIME_TYPE, BLOB_CONTENT, name, doc_size INTO v_mime,lob_loc,v_file_name,v_length FROM resumes WHERE id = p_file; -- set up HTTP header owa_util.mime_header( nvl(v_mime,'application/octet'), FALSE ); -- set the size so the browser knows how much to download htp.p('Content-length: ' || v_length); -- the filename will be used by the browser if the users does a save as htp.p('Content-Disposition: attachment; filename="'||replace(replace(substr(v_file_name,instr(v_file_name,'/')+1),chr(10),null),chr(13),null)|| '"'); -- close the headers owa_util.http_header_close; -- download the BLOB wpg_docload.download_file( Lob_loc ); end download_my_file;

25 Indexing the Documents
Need an Oracle Text index create index doc_ctxidx on resumes(blob_content) indextype is ctxsys.context parameters ('datastore CTXSYS.DEFAULT_DATASTORE') You must re-index regularly begin ctx_ddl.sync_index('doc_ctxidx','2M'); end;

26 Searching the Index Create a search field on the page (e.g. p14_search) Query, joining document to a person select r.ID, pd.person_ID person_id, NAME, FILENAME, TITLE, MIME_TYPE, DOC_SIZE, CREATED_BY, CREATED_ON, UPDATED_BY, UPDATED_ON, LAST_UPDATED, CONTENT_TYPE, LANGUAGE, r.DESCRIPTION, pd.DESCRIPTION person_description, FILE_TYPE, FILE_CHARSET, get_person_attributes(pd.person_id, chr(13)) person_attribute_info, get_person_docs(pd.person_id, '<br>') all_docs from resumes r, person_document pd where contains (BLOB_CONTENT, :p14_search) > 1 and r.id = pd.document(+)

27 The Results

28 See this tip from Brad G - cool
I think I figured it out.  What I did was create an image for each page with the naming convention “trio_hdr_[PAGE_ID].jpg”, i.e. header_img_170.jpg.  I then replaced the logo definition as follows: This allows the #LOGO# in the template to resolve to the correct image name. Thanks, Brad Gibson From: Gibson Brad - IL Sent: Friday, May 08, :02 PM To: Linnemeyer Larry - CO; Brown Bradley - CO; Kissinger Bruce - WI Subject: APEX Custom Headers I was wondering if you guys might have an idea on how to customize the header in an Apex application.  What I want to do is dynamically generate the header based off what page I am on.  I figure I would have to use the substitution variables and then load an image based on the value.  Each page would have its own image or set of images that would make up the header.  What I was thinking was that I would need to modify the template and theme that I am using.  This seems like a lot of work for something that could be done on a JSP page with one line of code.  Is there an easier way to make the header dynamic without going the modified template/theme route?

29 Outlook (or other) Integration
Add to my Calendar Industry standard (RFC 2445) ICS format Mac/Apple iCalendar, Mozilla Calendar, Outlook, etc. Add contact Industry standard contact VCF format Links Mass Campaigns Reminders Workflow

30 Email links Select statement Link
select '<a href="mailto:' || me. _ADDRESS || '">' || first_name || ' ' || last_name || '</a>' Member Link Report attributes, pick attribute, link Link Text = #MEMBER# Target = URL URL = mailto:# _ADDRESS# Highlight current, outlook calendar, see link

31 Sending mass s I like my own send_ procedure ( me and I’ll send it) CREATE OR REPLACE PROCEDURE Send_ (in_mail_server VARCHAR2 DEFAULT 'exchange.tusc.com', in_sender_ VARCHAR2 DEFAULT in_sender_name VARCHAR2 DEFAULT 'My Full Name', in_recipient_ VARCHAR2 DEFAULT in_recipient_name VARCHAR2 DEFAULT 'Your Full Name', in_cc_ VARCHAR2 DEFAULT in_cc_name VARCHAR2 DEFAULT 'My Full Name', in_html_flg VARCHAR2 DEFAULT 'N', in_subject VARCHAR2 DEFAULT 'No Subject was Provided', in_importance VARCHAR2 DEFAULT 'Normal', in_body VARCHAR2 DEFAULT 'No Body for this ')

32 “Add to my calendar” feature
Industry standard (RFC 2445) ICS format Mac/Apple iCalendar, Mozilla Calendar, Outlook, etc. Branch to a PL/SQL page Mime-type is key Outlook calendar, edit user, add expiring…

33 The Guts of the Code htp.init; -- Wipe out the buffer owa_util.MIME_HEADER('text/calendar; method=request'); -- Get the event information htp.print('BEGIN:VCALENDAR'); htp.print('PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN'); htp.print('VERSION:2.0'); htp.print('METHOD:PUBLISH'); htp.print('BEGIN:VEVENT'); htp.print('DTSTART;TZNAME=MST:' || to_char(nvl(to_date(v('P12_expires_ON'),'mm/dd/yyyy'),l_expires_on), 'yyyymmdd') || 'T080000'); … htp.print('DESCRIPTION:Reminder for account expiring'); htp.print('END:VALARM'); htp.print('END:VEVENT'); htp.print('END:VCALENDAR'); end;

34 “Add Contact” feature Industry standard VCF format Similar to ICS
Mac/Apple iCalendar, Mozilla Calendar, Outlook, etc. Similar to ICS Branch to a PL/SQL page Mime-type is key Outlook calendar

35 The guts of the contacts
Declare cursor user_cur is select user_name, expires_on, company, phone, … from demo_users where user_id = :p14_user_id; Begin -- Get the user data for user_rec in user_cur loop htp.init; -- Wipe out the buffer owa_util.MIME_HEADER('text/x-vcard; method=request'); -- Get the user information htp.print('BEGIN:VCARD'); htp.print('VERSION:3.0'); htp.print('N:' || user_rec.user_name || ';;'); htp.print('ADR;HOME:;;'); htp.print(' ;PREF;INTERNET:' || user_rec. _address); htp.print('NOTE;ENCODING=QUOTED-PRINTABLE: Expires on ' || user_rec.expires_on || ' Admin user? ' || user_rec.admin_user || ' Quota: ' || user_rec.quota); htp.print('REV: T234724'); htp.print('END:VCARD'); end loop; end;

36 PL/SQL tips

37 Complex searches Multiple search fields
Can’t dynamically build the where clause Must use instr or like statements If large dataset, recommend: Indexes on columns Use like :p1_search || ‘%’ Don’t use like ‘%’ || :p1_search || ‘%’ or instr Use separate pages / queries / regions for each field queried Can use Oracle Text (i.e. contains)

38 Function-based (Complex) Queries
Let’s say you want to know The first and last date you received an RSVP The number of people who RSVPed each day between No easy way to execute this query Build a function-based query Function Table and column data types View based on casted function

39 The Function RSVP_FUNCTION
CREATE OR REPLACE FUNCTION rsvp_function (in_event_no number) RETURN rsvp_table PIPELINED IS out_rec RSVP_COLUMNS := RSVP_COLUMNS(NULL,NULL,NULL,NULL,NULL); TableSet RSVP_TABLE; cursor min_max_cur is select min(trunc(rsvp_date)) min_date, max(trunc(rsvp_date)) max_date, max(trunc(rsvp_date))-min(trunc(rsvp_date)) days from rsvp where event_no = in_event_no; cursor count_invitees_cur is select count(*) count from rsvp where event_no = in_event_no; cursor count_as_of_cur (in_date date) is select sum(decode(yn,'Y',1,0)) y, sum(decode(yn,'N',1,0)) n where event_no = in_event_no and rsvp_date <= in_date + 1; total number := 0;

40 RSVP_FUNCTION BEGIN -- Figure out the total count of invited people for count_invitees_rec in count_invitees_cur loop total := count_invitees_rec.count; end loop; for min_max_rec in min_max_cur loop FOR i IN 1 .. min_max_rec.days+1 LOOP out_rec.event_no := in_event_no; out_rec.rsvp_date := min_max_rec.min_date + i - 1; for count_as_of_rec in count_as_of_cur(out_rec.rsvp_date) loop out_rec.y := count_as_of_rec.y; out_rec.n := count_as_of_rec.n; out_rec.w := total - count_as_of_rec.y - count_as_of_rec.n; end loop; PIPE ROW(out_rec); END LOOP; RETURN; END;

41 The Data Types RSVP_COLUMNS and RSVP_TABLE
CREATE OR REPLACE TYPE rsvp_Columns AS OBJECT ( event_no number, rsvp_date date, y number, n number, w number); Table TYPE RSVP_Table AS TABLE OF YPO.RSVP_COLUMNS

42 The View / Query 3 series (yes, no, waiting)
select rsvp_date, y from table(cast(rsvp_function(:P3_IN_EVENT_NO) as rsvp_Table)) select rsvp_date, n from table(cast(rsvp_function(:P3_IN_EVENT_NO) as rsvp_Table)) select rsvp_date, w from table(cast(rsvp_function(:P3_IN_EVENT_NO) as rsvp_Table))

43 The Results

44 Apex Add-ons (APIs) Apex_plssql_job Apex_collection Apex_Ldap
Apex_Mail Apex_Util

45 Background jobs apex_plsql_job is a wrapper written around dbms_job
APEX_PLSQL_JOBS is a table containing the job information for those submitted Very helpful for those hourly, daily, weekly, etc. processes

46 Functions and Procedures
SUBMIT_PROCESS (function) Submits background PL/SQL, returns a unique job number. Job number is a reference point for other procedures and functions in this package. UPDATE_JOB_STATUS Updates the status of the currently running job. Most effective when called from the submitted PL/SQL. TIME_ELAPSED Determines how much time has elapsed since the job was submitted. JOBS_ARE_ENABLED Determines whether or not the database is currently in a mode which supports submitting jobs to the APEX_PLSQL_JOB package. PURGE_PROCESS Cleans up submitted jobs. Submitted jobs stay in the APEX_PLSQL_JOBS view until either Oracle Oracle Application Express cleans out those records, or you call PURGE_PROCESS to manually remove them.

47 JavaScript, AJAX, etc.

48 JavaScript JavaScript provides client-side power
Good doc to work from: Where to Place JavaScript Functions Calling JavaScript from a Button Add Client-Side JavaScript Validations Enable / Disable Form Elements Change the Value of Form Elements Use of java script - document all of the javascript that comes in the javascript files in htmldb like setValue function in the functions.js file this is used to do the quick sets of text fields with the links that are just below the field. HOW'd they do that- good examle would be in the column link section of the column attributes page where a mouse over displays the icon and javascript is used to populate the field when you select one. The html site has a whole section under the how to s on java script. Debugging - enabling SQL Trace and TKPROF see 11-2 in user manual Good how to document to focus on an item, make sure to change focus property in page properties <script type="text/javascript"> first_field('P20_FROM_DATE'); </script>

49 Apex JavaScript - Setting Focus
Check out /i/javascript/apex_html_elements.js for a complete list of already developed JavaScript (charCount, setStyle, confirmDelete, hideShow, GetCookie, SetCookie, html_PopUp, etc) To focus on an item, make sure to change focus property in page properties – first_field is a build-in function: <script type="text/javascript"> first_field('P20_FROM_DATE'); </script>

50 AJAX and Other DHTML Tricks
Asynchronous JavaScript and XML Rest Http get commands Returns XML Excellent examples

51 Using AJAX Asynchronous Java Script and XML
Not new technology, just combination of existing Interacts with the server without refreshing the page Used a lot in APEX SQL workshop APEX makes implementation simple Refresh a variety of objects Single display item Multi-value things such as select list Entire report regions The Oracle Experts

52 Using AJAX Select a value Populates Job Select a department
Populates select list The Oracle Experts

53 AJAX Key Elements Item with onChange event
JavaScript function called by onChange Calls Process using htmldb_Get Uses results Application Level Process On Demand returns value or XML document Application Level Items, used in process Page Zero The Oracle Experts

54 AJAX using a Query Process
Two page items Select list with onChange trigger Text field to accept value Select list calls JavaScript function when its value is changed The Oracle Experts

55 Netflix Flyups Netflix uses AJAX to retrieve its flyups.
For a great thread on how to implement this, see

56 Google Map Integration
Easy integration

57 Summary Oracle Application Express is powerful Download the Sample App
Real examples in there Lots of great code Forum is helpful and well monitored Watch for Web 2.0 additions

58 Where to Get More Information?
Numerous presentations on the TUSC site Full Day Tutorials Numerous 1-3 hour sessions Local Oracle Users Groups TUSC’s Training Center Oracle Application Express Handbook by Larry Linnemeyer and Bradley D. Brown December 2005 Oracle Application Express Forum, Oracle Application Express Studio, etc.

59 Want more Information? Call or email TUSC Call or email Brad
Call or Brad Visit our site Register for our newsletter

60 Questions?

61 Brad’s Papers and Presentations
Java-based Oracle Web Development Java Server Pages JavaMail Java for the PL/SQL Developer Web Cache – achieving 150 the performance 9iAS Installation, Configuration, and Tuning Wireless Practical Portal Practices Implementing JSP in Portal UltraSearch Search Engines Utl_smtp and Utl_http iFS JavaScript Top DBA scripts for Web Developers Security

62 Special Thanks Larry Linnemeyer – for his advanced topics and all of his work on the Oracle Application Express book

63 Other TUSC Presentations and Papers
Tuning Database SQL Applications Security Migrations Discoverer & BI Built-in Packages PL/SQL New Features Forms, Reports Designer Team Management Uncommon Leaders Workflow DBA topics

64 Copyright Information
Neither TUSC nor the author guarantee this document to be error-free. Please provide comments/questions to TUSC © This document cannot be reproduced without expressed written consent from an officer of TUSC.


Download ppt "Advanced Application Express Tips and Techniques"

Similar presentations


Ads by Google