We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 68
Professional Software Development using APEX
Rob van Wijk
Rob van Wijk since 1972 Oracle since 1995 Ciber since 2003 Oracle ACE since 2008 Oracle University SQL Masterclass since 2011 Forums: OTN & Stack Overflow Blog: rwijk.blogspot.com Twitter: @rwijk
About me
Starting with HTMLDB/APEX since 2005 Own APEX website www.robstourpoules.nl since 2009 Programming OGh APEX day conference since 2010 Ciber APEXSoFa since early 2012 Working with APEX since November 2012
My APEX experience Development User Acceptance Test professional [pruh-fesh-uh-nl] adjective
3. appropriate to a profession: professional objectivity.
Source: http://dictionary.reference.com/browse/professional?s=t Do you use source control? Can you make a build in one step? Do you make daily builds? Do you have a bug database? Do you fix bugs before writing new code? Do you have an up-to-date schedule? Do you have a spec? Do programmers have quiet working conditions? Do you use the best tools money can buy? Do you have testers? Do new candidates write code during their interview? Do you do hallway usability testing?
The Joel Test Source: http://www.joelonsoftware.com/articles/fog0000000043.html Do you use source control? Can you make a build in one step? Do you make daily builds? Do you have a bug database? Do you fix bugs before writing new code? Do you have an up-to-date schedule? Do you have a spec? Do programmers have quiet working conditions? Do you use the best tools money can buy? Do you have testers? Do new candidates write code during their interview? Do you do hallway usability testing?
The Joel Test Source: http://www.joelonsoftware.com/articles/fog0000000043.html
1. Version Control 2. Parallel Development 3. One-Step Build 4. Daily Build 5. Unit Testing
Agenda 1. Version Control Goal
The entire application can be installed completely from files under version control svn repository tekst Subversion client for Windows:
Subversion client for Mac: Cornerstone
Oracle Application Express APEX_040100 schema DATA schema Tables, Data, Indexes, Sequences UI schema, APEXs parsing schema views and packages containing minimal set of API layer calls API schema Database packages with business logic views selecting from tables select, insert, update & delete API calls Minimal system privileges
No CREATE SESSION privilege
Password generated with dbms_random.string(a,30) UI, API & DATA schema APEXExport
APEXExportSplitter META schema SQL> select * from meta.mta_applications 2 /CODE NAME APEX_APPLICATION_ID---------- ------------------------------------------------- -------------------CV Ciber CV's 1SCA Standen Collectie Applicatie 22 rows selected. META schema SQL> desc meta.mta_admin...PROCEDURE ADD_APPLICATION Argument Name Type In/Out Default? ------------------------------ --------- -------------- ------ -------- P_CODE VARCHAR2(10) IN P_NAME VARCHAR2(50) IN P_APEX_APPLICATION_ID NUMBER(5) IN ... FUNCTION APEX_APPLICATION_ID RETURNS NUMBER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -- ------ P_APP_CODE VARCHAR2(10) IN...PROCEDURE REMOVE_APPLICATION Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_CODE VARCHAR2(10) IN... A challenge with APEX and file based version control Your APEX working copy
Your APEX workspace application
get the delta from your APEX workspace into your working copy svn update put your colleagues changes plus your delta back into your APEX workspace rm -rf $HOME/ciber/apexsofa/$1/apexcd $HOME/ciber/apexsofa/$1java oracle.apex.APEXExport\ -db ourserver:1521:APEXSOFAO\ -user apex_040100\ -password secret\ -applicationid $2\ -skipExportDatejava oracle.apex.APEXExportSplitter f$2.sqlmv f$2 apexcd apexsed s_@application_@$1/apex/application_\ <install.sql\ >../non- apex/install/install_apex_components.sqlsvn status | grep ^\? | awk '{print $2}' | xargs svn addsvn status | grep ^\! | awk '{print $2}' | xargs svn delete --forcesvn updatecd ... non- apex/install/reinstall_apex z z
MacBookPro:application robvanwijk$ svn update Conflict discovered in 'pages/page_00004.sql'. Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: p C pages/page_00004.sql Updated to revision 96. Summary of conflicts: Text conflicts: 1 MacBookPro:application robvanwijk$ ls page_00004.sql* page_00004.sql page_00004.sql.mine page_00004.sql.r95 page_00004.sql.r96
Merge conflict whenever sqlerror exit failure Development database APEX
Workspace Ciber CV SCA Schema SCA_UI Schema SCA_API Schema SCA_DA TA Schema CV_UI Schema CV_API Schema CV_DAT A Schema META User INSTALL 2. Parallel Development The developer should be free to experiment as much as possible, safe in the knowledge that the worst that could happen is they destroy only their own environment and not impact the productivity of others. - Nick Ashley Source: http://dbdeploy.com/documentation/taking-control-of-your-database-development-white-paper/ each developer has its own four database schemas, for instance: RWIJK RWIJK_UI RWIJK_API RWIJK_DATA and each developer has its own APEX workspace Development database APEX
Workspace Ciber CV SCA Schema SCA_UI Schema SCA_API Schema SCA_DA TA Schema CV_UI Schema CV_API Schema CV_DAT A Schema META User INSTALL Workspace RWIJK SCA Schema RWIJK_UI Schema RWIJK_API Schema RWIJK_DA TA Workspace MPLAS CV SCA Schema MPLAS_UI Schema MPLAS_API Schema MPLAS_DA TA User RWIJK User MPLAS META schema SQL> select code 2 , name 3 , apex_application_id_from 4 , apex_application_id_until 5 from meta.mta_developers 6 /CODE NAME APEX_APPLICATION_ID_FROM APEX_APPLICATION_ID_UNTIL---------- ------------------- ------------------------ -------------------------RWIJK Rob van Wijk 10000 10999MPLAS Marcel van der Plas 11000 11999MHOEFS Marcel Hoefs 12000 12999EASLAN Erdal Aslan 13000 13999ASUVEREIN Arne Suverein 14000 14999EHAMERS Etienne Hamers 15000 15999LSAVALKA Larysa Savalka 16000 169997 rows selected. META schema SQL> desc meta.mta_admin...PROCEDURE ADD_DEVELOPER Argument Name Type In/Out Default? ------------------------------ --------- -------------- ------ -------- P_CODE VARCHAR2(10) IN P_NAME VARCHAR2(30) IN P_APEX_APPLICATION_ID_FROM NUMBER(5) IN P_APEX_APPLICATION_ID_UNTIL NUMBER(5) IN ... PROCEDURE REMOVE_DEVELOPER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -- ------ P_CODE VARCHAR2(10) IN... META schema SQL> select dev_code 2 , app_code 3 , apex_application_id 4 from meta.mta_application_copies 5 order by apex_application_id 6 /DEV_CODE APP_CODE APEX_APPLICATION_ID---------- ---------- ------------------RWIJK CV 10000RWIJK SCA 10001MPLAS CV 11000MPLAS SCA 11001MHOEFS SCA 12000MHOEFS CV 12001EASLAN SCA 13000EASLAN CV 13001ASUVEREIN SCA 14000EHAMERS SCA 15000LSAVALKA SCA 16000LSAVALKA CV 1600112 rows selected. META schema SQL> desc meta.mta_admin ...PROCEDURE ADD_APPLICATION_COPY Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -- ------ P_DEV_CODE VARCHAR2(10) IN P_APP_CODE VARCHAR2(10) IN P_APEX_APPLICATION_ID NUMBER(5) IN DEFAULT FUNCTION APEX_APPLICATION_ID RETURNS NUMBER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -- ------ P_APP_CODE VARCHAR2(10) IN P_SCHEMAPREFIX VARCHAR2 INFUNCTION APEX_WORKSPACE_ID RETURNS NUMBER Argument Name Type In/Out Default? ------------------ ------------ ----------------------- ------ -------- P_SCHEMAPREFIX VARCHAR2 INPROCEDURE REMOVE_APPLICATION_COPY Argument Name Type In/Out Default? ------------------------------ --------- -------------- ------ -------- P_DEV_CODE VARCHAR2(10) IN P_APP_CODE VARCHAR2(10) IN ... set define off set verify off set feedback off WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK begin wwv_flow.g_import_in_progress := true; end; /
-- AAAA PPPPP EEEEEE XX XX -- AA AA PP PP EE XX XX -- AA AA PP PP EE XX XX -- AAAAAAAAAA PPPPP EEEE XXXX -- AA AA PP EE XX XX -- AA AA PP EE XX XX -- AA AA PP EEEEEE XX XX prompt Set Credentials...
begin
-- Assumes you are running the script connected to SQL*Plus as the Oracle user APEX_040100 or as the owner (parsing schema) of the application.
column current_schema new_value CURSCHEMA select sys_context('userenv','current_schema') current_schema from dual /
set verify off
define SCHEMAPREFIX='&1'
prompt ************************************************************************************* prompt De-installeer db-gedeelte van SCA uit schema's &SCHEMAPREFIX._data, &SCHEMAPREFIX._api en &SCHEMAPREFIX._ui prompt *************************************************************************************
alter session set current_schema = &SCHEMAPREFIX._data /
remark remark Verwijder hier alle objecten uit de DATA-laag remark drop table sca_klanten cascade constraints purge / drop table sca_meetinstallaties cascade constraints purge / drop table sca_meterstanden cascade constraints purge / drop table sca_opnames cascade constraints purge / drop sequence sca_klt_seq1 / drop sequence sca_mie_seq1 / drop sequence sca_msd_seq1 / drop sequence sca_one_seq1 /
alter session set current_schema = &SCHEMAPREFIX._api /
remark remark Verwijder hier alle objecten uit de API-laag remark
alter session set current_schema = &SCHEMAPREFIX._ui /
remark remark Verwijder hier alle objecten uit de UI-laag remark drop synonym sca_klanten / drop synonym sca_meetinstallaties / drop synonym sca_meterstanden / drop synonym sca_opnames / drop synonym sca_klt_seq1 / drop synonym sca_mie_seq1 / drop synonym sca_msd_seq1 / drop synonym sca_one_seq1 / alter session set current_schema = &CURSCHEMA /
set verify on undefine SCHEMAPREFIX undefine CURSCHEMA
remark remark install_apex.sql remark remark Rob van Wijk, 6 juni 2012 remark
define SCHEMAPREFIX='&1' define APPLICATIE='sca'
prompt *************************************************************************** prompt Installeer APEX-gedeelte van &APPLICATIE in de werkruimte horend bij schemaprefix &SCHEMAPREFIX. prompt ***************************************************************************
set verify off
column current_schema new_value curschema select sys_context('userenv','current_schema') current_schema from dual /
alter session set current_schema = &SCHEMAPREFIX._ui /
declare cn_schemaprefix constant varchar2(25) := '&SCHEMAPREFIX'; cn_applicatie constant varchar2(30) := '&APPLICATIE'; begin apex_application_install.set_workspace_id(meta.mta_admin.apex_werkruimte_id(cn_schemaprefix)); apex_application_install.set_application_id(meta.mta_admin.apex_applicatie_id(cn_applicatie,cn_schemaprefix)); apex_application_install.set_offset(meta.mta_admin.apex_offset_id(cn_schemaprefix)); apex_application_install.set_schema(upper(cn_schemaprefix) || '_UI'); apex_application_install.set_application_alias ( case lower(cn_schemaprefix) when lower(cn_applicatie) then cn_applicatie else cn_applicatie || '_' || cn_schemaprefix end ); end; /
@@install_apex_components
whenever sqlerror continue
alter session set current_schema = &CURSCHEMA /
undefine APPLICATIE undefine SCHEMAPREFIX
remark remark uninstall_apex.sql remark remark Rob van Wijk, 6 juni 2012 remark
define SCHEMAPREFIX='&1' define APPLICATIE='sca'
prompt *************************************************************************** prompt De-installeer APEX-gedeelte van &APPLICATIE uit werkruimte horend bij schemaprefix &SCHEMAPREFIX. prompt ***************************************************************************
set verify off
column current_schema new_value curschema select sys_context('userenv','current_schema') current_schema from dual /
alter session set current_schema = &SCHEMAPREFIX._UI /
remark remark Dit script wordt gebruikt om zowel het applicatieschema als een gebruikersschema te verwijderen. remark Gebruik package APEX_APPLICATION_INSTALL om precies aan te geven welke applicatie we gaan verwijderen. remark
remark remark Zet het huidige schema terug naar de oorspronkelijke waarde remark
alter session set current_schema = &CURSCHEMA /
set verify on undefine schemaprefix undefine applicatie
4. Daily Build Goal
to ensure no breakage of the build goes unnoticed
Extensible continuous integration server
svn repository Application schemas RWIJK development schemas MPLAS development schemas LSAVALKA development schemas .
.
.
Started by timer Updating http://cbrlaot001.gen.cms.local/svn/repos/trunk/sca revision: Nov 25, 2012 2:01:15 AM depth:infinity ignoreExternals: false At revision 95 no change for http://cbrlaot001.gen.cms.local/svn/repos/trunk/sca since the previous build [workspace] $ /bin/sh -xe /tmp/hudson5181239197586695389.sh + ORAENV_ASK=NO + ORACLE_SID=APEXSOFAO + . oraenv ++ SILENT= ++ case ${ORACLE_TRACE:-""} in ++ N= ++ C= ++ echo '\c' ++ grep c ++ N=-n ++ '[' 0 = 0 ']' ++ OLDHOME=/usr/kerberos/bin:/opt/sw/java/jdk1.6.0_30/bin:/usr/local/bin:/bin:/usr/bin:/opt/sw/firefox:/home/gladmin/bin ++ case ${ORAENV_ASK:-""} in ++ NEWSID=APEXSOFAO ++ export ORACLE_SID +++ dbhome APEXSOFAO ++ ORAHOME=/opt/sw/oradmin/product/11.2.0.3/dbhome_1 ++ case $? in ++ ORACLE_HOME=/opt/sw/oradmin/product/11.2.0.3/dbhome_1 ++ export ORACLE_HOME ++ case ${LD_LIBRARY_PATH:-""} in ++ LD_LIBRARY_PATH=/opt/sw/oradmin/product/11.2.0.3/dbhome_1/lib:/opt/sw/java/jdk1.6.0_30/jre/lib/amd64/server:/opt/sw/java/jdk1.6.0_30/jre/lib/amd64:/opt/sw/java/jdk1.6.0_30/jre/../lib/amd64 ++ export LD_LIBRARY_PATH ++ case "$OLDHOME" in ++ case "$PATH" in ++ PATH=/usr/kerberos/bin:/opt/sw/java/jdk1.6.0_30/bin:/usr/local/bin:/bin:/usr/bin:/opt/sw/firefox:/home/gladmin/bin:/opt/sw/oradmin/product/11.2.0.3/dbhome_1/bin ++ export PATH +++ LANG=C +++ ulimit ++ ULIMIT=unlimited ++ '[' 0 = 0 -a unlimited '!=' unlimited ']' ++ ORABASE_EXEC=/opt/sw/oradmin/product/11.2.0.3/dbhome_1/bin/orabase ++ '[' x '!=' x ']' ++ OLD_ORACLE_BASE= ++ '[' -w /opt/sw/oradmin/product/11.2.0.3/dbhome_1/inventory/ContentsXML/oraclehomeproperties.xml ']' ++ '[' '' '!=' true ']' ++ echo 'ORACLE_BASE environment variable is not being set since this' ORACLE_BASE environment variable is not being set since this ++ echo 'information is not available for the current user ID gladmin.' information is not available for the current user ID gladmin. ++ echo 'You can set ORACLE_BASE manually if it is required.' You can set ORACLE_BASE manually if it is required. + unset ORAENV_ASK + cd /opt/sw/hudson/jobs/hudson_sca/workspace + pwd /opt/sw/hudson/jobs/hudson_sca/workspace + sqlplus install/install @sca/non-apex/install/build sca
SQL*Plus: Release 11.2.0.3.0 Production on Sun Nov 25 02:01:20 2012
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options
CURRENT_SCHEMA -------------------------------------------------------------------------------- INSTALL APPLICATION 12000 - SCA Set Credentials... Check Compatibility... API Last Extended:20110212 Your Current Version:20110212 This import is compatible with version: 20110212 COMPATIBLE (You should be able to run this import without issues.) Set Application ID... ...done old 1: alter session set current_schema = &CURSCHEMA new 1: alter session set current_schema = INSTALL
************************************************************************************* De-installeer db-gedeelte van SCA uit schema's sca_data, sca_api en sca_ui *************************************************************************************
*************************************************************************** Installeer db-gedeelte van sca in schema's sca_data, sca_api en sca_ui ***************************************************************************
Session altered.
Table created.
Index created.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Table created.
Index created.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Table created.
Index created.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Table created.
Index created.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Table altered.
Sequence created.
Sequence created.
Sequence created.
Sequence created.
Index created.
Index created.
Index created.
Index created.
Grant succeeded.
Grant succeeded.
Grant succeeded.
Grant succeeded.
Grant succeeded.
Grant succeeded.
Grant succeeded.
Grant succeeded.
Session altered.
Session altered.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Session altered.
*************************************************************************** Installeer APEX-gedeelte van sca in de werkruimte horend bij schemaprefix sca ***************************************************************************
In Hudson build, developers have option to get a fresh development environment each night META schema SQL> select dev_code 2 , app_code 3 , apex_application_id 4 , ind_daily_db_refresh 5 , ind_daily_apex_refresh 6 from meta.mta_application_copies 7 /DEV_CODE APP_CODE APEX_APPLICATION_ID I I-- -------- ---------- ------------------- - -RWIJK CV 10000 J NRWIJK SCA 10001 J JMPLAS CV 11000 J NMPLAS SCA 11001 N NMHOEFS CV 12001 J JMHOEFS SCA 12000 J JEASLAN SCA 13000 J JEASLAN CV 13001 J JASUVEREIN SCA 14000 J JEHAMERS SCA 15000 J NLSAVALKA SCA 16000 J J LSAVALKA CV 16001 J J META schema SQL> desc meta.mta_admin ...PROCEDURE SET_IND_DAILY_APEX_REFRESH Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -- ------ P_DEV_CODE VARCHAR2(10) IN P_APP_CODE VARCHAR2(10) IN P_IND_DAILY_APEX_REFRESH VARCHAR2(1) INPROCEDURE SET_IND_DAILY_DB_REFRESH Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -- ------ P_DEV_CODE VARCHAR2(10) IN P_APP_CODE VARCHAR2(10) IN P_IND_DAILY_DB_REFRESH VARCHAR2(1) IN ... 5. Unit Testing Goal
Add value to the automatic build by determining if your (packaged) functions and procedures are fit to use
Development database APEX
Workspace Ciber CV SCA Schema SCA_UI Schema SCA_API Schema SCA_DA TA Schema CV_UI Schema CV_API Schema CV_DAT A Schema META User INSTALL Workspace RWIJK SCA Schema RWIJK_UI Schema RWIJK_API Schema RWIJK_DA TA Workspace MPLAS CV SCA Schema MPLAS_UI Schema MPLAS_API Schema MPLAS_DA TA User RWIJK User MPLAS Schema UT A single shared test repository in schema UT Using command line (UtUtil) a different test suite per package Schema names are included in XML definition files (Un)Load from client: UtUtil.bat & UtUtil.sh exp/imp scripts Automatic load when installing db-part of application Automatic unload when uninstalling db-part of application run all unit tests in application schema in Hudsons nightly build manually start unit tests in developers schema
Completing Unit Testing Selenium Template project Delivering patches Sonar