Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Introduction Oracle Database 11g Release 2 for developers

10,480 views

Published on

"This presentations provides an overview of the most striking new functionality in Oracle Database 11g Release 2, as seen through the eyes of (database) developers. The presentation introduces new analytical functionality, the successor to the connect by clause for hierarchical queries, parallel statement execution, new packages and especially: Edition Based Redefinition. This presentation was performed (with live demos) during the AMIS Query on 29th September 2009.

Published in: Technology, Business

Introduction Oracle Database 11g Release 2 for developers

  1. 1. Introducing Oracle Database 11g Release 2 for DevelopersOn SQL, PL/SQL and Application Development<br />Lucas Jellema <br />AMIS<br />29th September 2009<br />
  2. 2. Quick Overview<br />Analytical stuff<br />LISTAGG, NTH_VALUE, Ignore nulls<br />Recursive Subquery Factoring<br />The new hierarchical query<br />Parallel processing of statements<br />Small Fry<br />Big Fry: Edition Based Redefinition<br />
  3. 3. Analytical Functions FIRST_VALUE and LAST_VALUE return the first and last value in a WINDOW<br />For example a query to return the colleague (same department) who has the highest salarya similar query with last_value(or with order by salasc) would return the colleague with the lowest salary<br />select deptno<br />, ename<br />, first_value(ename) over (partition by deptno order by saldesc)<br />most_earning_colleague<br />from emp<br />NTH_VALUE complements FIRST_VALUE and LAST_VALUE<br />
  4. 4. Analytical Function NTH_VALUE returns the NTH_VALUE in a WINDOW<br />FIRST_VALUE(column) == NTH_VALUE(column,1)<br />LAST_VALUE(column) == NTH_VALUE(column,1) FROM LAST<br />For example a query to return the colleague (same department) who has the second highest salary<br />select deptno<br />, ename<br />, nth_value(ename,2) from first over (partition by deptno order by saldesc)<br />almost_highest_earning_colleague<br />from emp<br />NTH_VALUE complements FIRST_VALUE and LAST_VALUE<br />
  5. 5. NTH_VALUE<br />Measure_Expr and N are both expressions<br />composed of columns, SQL functions, PL/SQL function call, constants, scalar subqueries<br />FROM LAST can be used to start counting at the end of the window<br />IGNORE NULLS can be used to ignore rows that have NULL as measure_expr<br />
  6. 6. More on NTH_VALUE<br />FROM FIRST (default) and FROM LAST can be used to start counting at either end of the window<br />NTH_VALUE( sal ,2) over (order by saldesc) ==NTH_VALUE( sal ,2) FROM FIRST over (order by saldesc)==NTH_VALUE( sal ,2) FROM LAST over (order by salasc) ROWS UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING<br />
  7. 7. More on NTH_VALUE<br />IGNORE NULLS can be added to not count rows for which the expression evaluates to NULL<br />The default is RESPECT NULLS<br />NTH_VALUE(COMM, 2) IGNORE NULLSOVER (ORDER BY SAL DESC)means:<br />Order the employees by salary, the top earner first<br />Find the second row where COMM is not null<br />Return the value of COMM in that row<br />
  8. 8. Example: difference between top 2<br />For example a query to return all employees and per employee the difference between the highest earning colleague and the second highest earning colleague<br />select deptno<br />, ename<br />, first_value(sal) over (partition by deptno order by saldesc) - nth_value(sal,2) from first over (partition by deptno order by saldesc)<br /> top2_difference<br />from emp<br />
  9. 9. LAG & LEAD – IGNORE NULLS<br />In the same way as for NTH_VALUE, IGNORE NULLS is used to skip rows for which the measure is NULL<br />This allows us to retrieve values from other rows in a more precise manner<br />For example:<br />Get the difference in COMM value between the current employee and the first less-experienced (later Hiredate) employee who also has a COMM value<br />IGNORE NULLS (together with a CASE expression) gives us a row filter for the LAG, LEAD and NTH_VALUE functions<br />
  10. 10. LAG without IGNORE NULLS<br />Show the Salary of the next Hire <br />select ename<br />, sal<br />, job<br />, lead (sal)<br /> over (order by hiredate)<br />sal_of_next_hire<br />from emp<br />order <br />by hiredate<br />
  11. 11. IGNORE NULLS & CASE– row filter<br />Give me for each employee the salary of the next hire – but ignore CLERKs as they are in a league of their own<br />select ename<br />, sal<br />, job<br />, lead ( case<br /> when job =&apos;CLERK&apos;<br /> then null<br /> else sal<br /> end<br /> ) ignore nulls<br /> over (order by hiredate)<br />sal_next_non_clerk_hire<br />from emp<br />order <br />by hiredate<br />
  12. 12. COLLECT aggregates records into collection<br />create or replace type <br />ename_type as table of varchar2(30)<br />select deptno<br />, avg(sal) avg_sal<br />, cast<br />( collect(ename)<br />as ename_type<br />) enames<br />from emp<br />group <br />by deptno<br />
  13. 13. LISTAGG – aggregating into string<br />We already had COLLECT for aggregating multiple values into a Collection<br />Requires a TYPE definition (usually TABLE OF VARCHAR2)<br />Only Aggregate Function (group by), not Analytical<br />Can do an order by especially for the Collected Values<br />LISTAGG creates a delimiter separated string of values<br />Produces a single VARCHAR2 (does not require a table type)<br />Available as Aggregate (with GROUP BY) and Analytical Function (with PARTITION clause)<br />Also includes an order by<br />
  14. 14. select deptno<br />, avg(sal) avg_sal<br />, listagg( ename, &apos;,&apos;) within group (order by sal)<br />enames<br />from emp<br />group <br />by deptno<br />LISTAGG aggregates values into string<br />
  15. 15. select deptno<br />, ename<br />, sal<br />, listagg( ename, &apos;,&apos;) within group (order by ename) over (partition by deptno)<br /> colleagues<br />from emp<br />order<br />by deptno<br />, ename<br />LISTAGG aggregates values into string<br />
  16. 16. Oracle goes industry standard…<br />
  17. 17. Hierarchical Query<br />Oracle specific (i.e. proprietary) approach<br />Since Oracle 2 or 3 (very early on)<br />Later extensions to hierarchical queries:<br />order siblings by<br />sys_connect_path<br />connect_by_root, connect_by_is_leaf, <br />nocycle, connect_by_is_cycle<br />with employees (empno, name, level) as <br />( select empno, ename, job, mgr, level<br /> from emp<br />start with mgr is null<br /> connect by prior empno = mgr<br />)<br />select *<br />from employees<br />
  18. 18. Hierarchical Query in ANSI SQL<br />ANSI SQL defines an alternative approach to Hierarchical Queries<br />It is called Recursive Subquery Factoring (or Recursive With Clause)<br />Apparently supported (to some extend) in DB2, SQL Server and PostgreSQL<br />Extends WITH clause to enable formulation of recursive queries.<br />“The query in the WITH clause (subquery) can refer to itself”<br />Recursive WITH clause is ANSI. This makes Oracle ANSI-compatible for recursive queries.<br />
  19. 19. Recursive Subquery Factoring<br />with employees (empno, name, job, mgr, hierlevel) as <br />( select empno, ename, job, mgr, 1<br /> from emp<br /> where mgr is null<br /> union all<br /> select e.empno, e.ename, e.job<br /> , e.mgr, m.hierlevel + 1<br /> from emp e<br /> join<br /> employees m<br /> on (m.empno = e.mgr) <br />)<br />select *<br />from employees<br />Root nodes<br />Recursive Child nodes<br />
  20. 20. What about the Connect by goodies?<br />SYS_CONNECT_PATH<br />Used to build the path from a node all the way to its root<br />with employees (empno, name, mgr, hierlevel, path) as <br />( select empno, ename, mgr, 1, ename<br /> from emp<br /> where mgr is null<br /> union all<br /> select e.empno, e.ename<br /> , e.mgr, m.hierlevel + 1<br /> , m.path||&apos;/&apos;||e.ename<br /> from emp e<br /> join<br /> employees m<br /> on (m.empno = e.mgr) <br />)<br />select *<br />from employees<br />
  21. 21. What about the Connect by goodies?<br />CONNECT_BY_ROOT<br />Used to retrieve a value from a node’s ultimate root<br />with employees (empno, name, mgr, hierlevel, root) as <br />( select empno, ename, mgr, 1, ename<br /> from emp<br /> where mgr is null<br /> union all<br /> select e.empno, e.ename<br /> , e.mgr, m.hierlevel + 1<br /> , m.root<br /> from emp e<br /> join<br /> employees m<br /> on (m.empno = e.mgr) <br />)<br />select *<br />from employees<br />
  22. 22. What about the Connect by goodies?<br />ORDER SIBLINGS BY<br />Set the sort order of child nodes under a parent node<br />with employees (empno, name, mgr, hierlevel) <br />as <br />( select empno, ename, mgr, 1 <br /> from emp<br /> where mgr is null<br /> union all<br /> select e.empno, e.ename<br /> , e.mgr, m.hierlevel + 1<br /> from emp e join employees m<br /> on (m.empno = e.mgr) <br />)<br />search depth first by name set seq<br />select *<br />from employees<br />
  23. 23. Search Clause for organizing rows<br />Use the SEARCH clause to specify ordering for rows<br />Specify BREADTH FIRST BY if you want sibling rows returned before any child rows are returned.<br />Specify DEPTH FIRST BY if you want child rows returned before any siblings rows are returned.<br />Sibling rows are ordered by the columns listed after the BY keyword.<br />The ordering_column is automatically added to the column list for the query name. Queries that select from the subquery can use an ORDER BY that refers to it<br />
  24. 24. What about the Connect by goodies?<br />ORDER SIBLINGS BY<br />with employees (empno, name, mgr, hierlevel) <br />as <br />( select empno, ename, mgr, 1 <br /> from emp<br /> where mgr is null<br /> union all<br /> select e.empno, e.ename<br /> , e.mgr, m.hierlevel + 1<br /> from emp e join employees m<br /> on (m.empno = e.mgr)<br />)<br />search breadth first by name set seq<br />select *<br />from employees<br />order by seq<br />
  25. 25. Recursive Subquery Factoring<br />with employees (empno, name, mgr, hierlevel) as <br />( select empno, ename, mgr, 1<br /> from emp<br /> where mgr is null<br /> union all<br /> select e.empno, e.ename, e.mgr, m.hierlevel + 1<br /> from emp e<br /> join<br /> employees m<br /> on (m.empno = e.mgr) order<br /> by e.ename<br />)<br />select *<br />from employees<br />
  26. 26. New PL/SQL Packages<br />DBMS_DBFS_HS<br />DBMS_COMPRESSION<br />DBMS_DBFS_CONTENT<br />DBMS_DBFS_CONTENT_SPI<br />DBMS_DBFS_HS<br />DBMS_DBFS_SFS<br />DBMS_DST<br />DBMS_PARALLEL_EXECUTE<br />DBMS_STREAMS_HANDLER_ADM<br />SEM_RDFCTX<br />SEM_RDFSA<br />
  27. 27. Some changes in PL/SQL packages<br />dbms_session.GET_PACKAGE_MEMORY_UTILIZATION - memory usage instantiated packages<br />dbms_space.ISDATAFILEDROPPABLE<br />dbms_utility.GET_SQL_HASH<br />dbms_utility.WAIT_ON_PENDING_DML<br />Waits until all transactions (other than the caller&apos;s own) that have locks on the listed tables and began prior to the specified SCN have either committed or been rolled back<br />
  28. 28. DBMS_PARALLEL_EXECUTE<br />Run a statement in parallel on chunks of data<br />Steps<br />Create a task label<br />Generate the chunks – rowid or value ranges<br />Run the task: a SQL statement that has :start_id and :end_id bind parameters<br />The task is executed with a certain degree of parallellism using job slaves<br />
  29. 29. UTL_MATCH<br />To find the similarity between strings<br />Used for example in deduplication of records or finding fuzzy matches<br />
  30. 30. Smaller Fry & Miscellaneous<br />Create or Replace Type with FORCE option<br />To replace even in the presence of dependents<br />Automatic Function Result Cache reset (automatic data source detection)<br />Function Result Cache accessible across RAC<br />APPEND_VALUES Hint – to usewith INSERT INTO VALUES …. (especially PL/SQL FORALL)<br />Fine Grained Invalidation extended to triggers<br />
  31. 31. Smaller Fry & Miscellaneous<br />Semantic Indexing of unstructured documents and the SEM_CONTAINS operator in SQL<br />And many more new Semantic Technologies<br />Handle Foreign Key dependencies for DBMS_FLASHBACK TRANSACTION_BACKOUT with CASCADE to roll back a transaction<br />Internet Protocol version 6 (IPv6) Support<br />IPv6 address has 128 bits, IPv4 address only 32 bits. IPv6 address must be in brackets in a URL<br />
  32. 32. Smaller Fry & Miscellaneous<br />IGNORE_ROW_ON_DUPKEY_INDEX and CHANGE_DUPKEY_ERROR_INDEX mandates<br />To instruct Oracle to ignore duplicate keys (just skip the row) or report an ORA-38911 to find out just which UNIQUE KEY caused the exception<br />Similar to 10gR2 DML Error Logging<br />More setting up and restrictions for Unique Key on Update & Merge and Direct Path Insert<br />
  33. 33. Release 2<br />Release 3<br />Base Release<br />Introducing Oracle 11gR2 Editioningor:On Parallel Application Universes<br />
  34. 34. Availability<br />Availability = Performance * (Up or Down)<br />Up = !Down<br />Down = Unplanned Down + Planned Down<br />Planned Down???<br />System Maintenance<br />Power-supply, Hardware & Network, O/S upgrade<br />Database patching & Upgrade<br />Application Upgrades<br />
  35. 35. Maximum Availability Architecture<br />
  36. 36. Application Upgrade<br />Creation of new objects<br />Changing existing objects (alter and create or replace)<br />Add, Modify or Drop columns or constraints<br />Change packages and stored procedures<br />Recompile<br />Drop redundant objects<br />Convert or migrate data<br />Resume normal operations<br />Application is DOWN<br />
  37. 37. Compare with road maintenance<br />
  38. 38. Restructuring A12<br />Build new road next to current one (A12-B)<br />Same “functionality” as the old road<br />At the cut-over moment<br />Open new A12-B: <br />Newly arriving traffic travels on temporary road<br />Close A12 (original)<br />Cars already on old road keep going<br />
  39. 39. 11gR2 Editioning is similar<br />Application Upgrade:<br />Prepare new release<br />Construct the release in parallel to the existing<br />Operations in existing application ‘edition’ continue normally<br />From the cut-over point:<br />Have new sessions operate on new release<br />Existing sessions can continue to run on existing release<br />
  40. 40. 11gR2 Editions introduces a new dimension in the database<br />Release 3<br />Release 2<br />Base Release<br />
  41. 41. Editions introduce or inherit versions of objects<br />Release 2<br />Release 3<br />Base Release<br />
  42. 42. Editions are parallel universes<br />Database Objects are identified by<br />Object Type<br />Schema<br />Object Name<br />…. Edition!<br />(release, application version, stripe, parallel universe id)<br />Database Sessions run in the context of a specific edition <br />Using a specific collection of versions of objects<br />
  43. 43. Database sessions run in a specific edition –one version of each object<br />Release 2<br />Release 3<br />Base Release<br />The database as seen by a sessionrunning in the context of Release 3<br />3<br />2<br />3<br />B<br />2<br />2<br />3<br />3<br />2<br />
  44. 44. Demo of Application Upgrade<br />Existing base application, in base edition<br />Create new editon – release_2<br />Create and Alter database objects<br />Base application continues running<br />Cut-over point<br />New sessions run in release_2 edition<br />Current sessions continue in base<br />
  45. 45. Some Rules for EBR (Edition Based Redefinition)<br />Editioning acts on packages, functions, triggers, procedures, views, types and synonyms<br />Editioning does not apply to tables<br />Data is not versionend, cloned, migrated<br />Different incarnations of a table are suggested through editionable views – there is only one table<br />Applications should never access tables directly!<br />Cross Edition Triggers on the table synchronize DML from different editions with the current state of the table <br />CET are temporary objects – not part of the application<br />
  46. 46. But wait, there is more<br />After the release of a new edition – there is no reason why you cannot keep the previous one going for some time<br />And multiple previous ones!<br />That means – END OF THE BIG BANG upgrade!<br />Multiple versions of the application can continue running to suport various user groups (e.g. SaaS)<br />Without data migration and additional downtime upon later move over of user groups<br />
  47. 47. Parallel Application Versions<br />Application X<br />VERSION 1<br />Application X<br />VERSION 2<br />Release 2<br />Release 3<br />Base Release<br />
  48. 48. Version 1 on Base Edition<br />
  49. 49. Version 1 on Edition Release 2<br />
  50. 50. Upgrade Base to Release 2<br />Authors<br />New columns COUNTRY and BIOGRAPHY<br />Books<br />Drop column NUM_OF_PAGES<br />Modified column ISBN (10 to 20 characters)<br />New columns LANGUAGE and PUBLICATION_YEAR<br />
  51. 51. Version 2 (on Edition Release 2)<br />
  52. 52. Version 2 on Base Edition<br />
  53. 53. Interesting Edition Tid-Bits<br />Drop Object in an Edition stops the inheritance from previous Edition. Object no longer is carried forward<br />Edition can have only one child – no branches (yet)<br />DBMS_SQL.PARSE can be executed in a specific Edition<br />Use parameter edition to specify other than current edition<br />If no explicit edition is set for a session, the default edition is used<br />ALTER DATABASE DEFAULT EDITION = edition_name; <br />Data Dictionary Views<br />DBA_/ALL_EDITIONS – editions in the database<br />DBA_/ALL_OBJECTS – objects (inherited) in current edition<br />DBA_/ALL_OBJECTS_AE – actual objects across all editions<br />
  54. 54. Editions and Tables<br />Tables cannot be versioned: there is only one definition of a table across all Editions<br />Data is not versioned: a record exists once and only once<br />Note: Workspace Management supports a form of versioning tables and data<br />The solution for managing changes to Tables: Editioning Views and Cross Edition Triggers<br />Editioning Views are defined on base table (no joins)<br />Editioning Views can have DML triggers defined (just like base table)<br />Using an editioning view in a query or DML statement does not impact the performance of the query or DML<br />
  55. 55. Editions and Tables<br />Application A<br />Application B<br />Table EMP<br />SAL<br />MGR<br />JOB<br />ENAME<br />HIREDATE<br />COMM<br />
  56. 56. Editions and Tables<br />Application A<br />Application B<br />Editioning View EMP <br />Table EMP_BASE<br />SAL<br />MGR<br />JOB<br />ENAME<br />HIREDATE<br />COMM<br />
  57. 57. Migrate to Editioning Views<br />Rename Table (for example to &lt;old table name&gt;_BASE)<br />(suggested but optional): changes the names of the columns in the table – to reflect change history<br />For example JOB_1_0, JOB_1_1, JOB_1_2 …<br />Create the Editioning View with the old table name<br />Using the ‘CREATE OR REPLACE EDITIONING VIEW &lt;view name&gt;’ statement<br />Recompile the triggers on the table<br />These now become triggers on the Editioning View<br />Recompile all invalid PL/SQL program units and Views<br />They now refer to the Editioning View instead of the table<br />VPD policies are reassigned to the View<br />Regular auditing and FGA is on the table<br />
  58. 58. Demo<br />ALTER TABLE EMP RENAME TO EMP_BASE;<br />CREATE OR REPLACE EDITIONING VIEW EMP<br />AS<br />SELECT ...<br />FROM EMP_BASE<br />/<br />DROP TRIGGER EMP_BRI<br />/<br />Rem recreate trigger on Editioning View<br />@&lt;EMP_BRI&gt;.trg<br />Rem recompile invalid Views and PL/SQL units<br />
  59. 59. Multiple versions of Editioning View <br />Application A<br />Application B<br />Edition R2<br />Edition R1<br />Editioning View EMP <br />Editioning View EMP <br />Table EMP_BASE<br />SAL<br />MGR<br />JOB<br />ENAME<br />HIREDATE<br />COMM<br />
  60. 60. Multiple versions of Editioning View <br />Application A<br />Application B<br />Edition R2<br />Edition R1<br />View EMP (1.1)<br />…* Language <br />View EMP (1.0)<br />Table EMP_BASE<br />SAL<br />MGR<br />JOB<br />ENAME<br />LANGUAGE<br />HIREDATE<br />COMM<br />Forward CrosseditionTrigger<br />
  61. 61. Demo<br />CREATE EDITION R2 AS CHILD OF R1;<br />ALTER SESSION SET EDITION R2;<br />SELECT SYS_CONTEXT(&apos;Userenv&apos;, &apos;Current_Edition_Name&apos;) &quot;Current_Edition&quot; FROM DUAL;<br />ALTER TABLE EMP_BASE<br />ADD (LANGUAGE VARCHAR2(2) NULL);<br />Rem function for deriving value for language<br />CREATE OR REPLACE FUNCTION <br />GET_LANGUAGE( p_job in varchar2) return varchar2<br />is<br />begin<br /> return case p_job when &apos;MANAGER&apos; then &apos;fr&apos; <br /> else &apos;en&apos; end;<br />end;<br />
  62. 62. Demo<br />Rem Create Forward Crossedition Trigger<br />Rem Applies to DML operations on EMP_BASE from <br />Rem Earlier Editions<br />CREATE OR REPLACE TRIGGER EMP_1_1_Fwd_Xed<br />BEFORE INSERT OR UPDATE ON EMP_BASE<br />FOR EACH ROW<br />FORWARD CROSSEDITION<br />DISABLE<br />BEGIN <br /> :new.language = get_language(:new.job);<br />END EMP_1_1_Fwd_Xed; <br />Rem Enable the Forward Crossedition Trigger<br />ALTER TRIGGEREMP_1_1_Fwd_Xed ENABLE; <br />
  63. 63. Demo<br />Rem Use Forward Crossedition trigger to<br />Rem upgrade existing table records according to new table<br />Rem version (for large # records use dbms_parallel_execute)<br />DECLARE <br /> c NUMBER := DBMS_SQL.OPEN_CURSOR(); <br /> x NUMBER; <br />BEGIN <br /> DBMS_SQL.PARSE<br /> ( c =&gt; c<br /> , Language_Flag =&gt; DBMS_SQL.NATIVE<br /> , Statement =&gt; &apos;UPDATE EMP_BASE SET EMPNO = EMPNO&apos;<br />, Apply_Crossedition_Trigger =&gt; &apos;EMP_1_1_Fwd_Xed&apos;<br /> );<br /> x := DBMS_SQL.EXECUTE(c); <br /> DBMS_SQL.CLOSE_CURSOR(c); <br />COMMIT; <br />END;<br />
  64. 64. Upgrade Table Definition<br />(Create Edition,) Switch to Edition<br />Make desired changes to the table<br />Add columns, modify Columns, …<br />Modify the Editioning View in the Edition <br />To reflect the table as its latest version should look<br />Perhaps hiding columns you eventually want to drop<br />(optional) Modify Editioning Views in previous Edition(s)<br />If the table change invalidates those Views<br />(optional) Create Forward Crossedition Trigger on base table to have DML on previous Editions made valid<br />(optional) Create Reverse Crossedition Trigger on base table to have DML on current Edition made valid<br />
  65. 65. Cross Edition Triggers<br />If you remove a (mandatory) column from the current Editioning View…<br />a Reverse Crossedition Trigger ensures that new records get some value in that (invisible) column<br />If you add a (mandatory) column to the table (and the current Editioning View)…<br />a Forward Crossedition Trigger ensures that records DMLed through previous Editioning View versions are made valid<br />(optionally) Apply Forward Crossedition Trigger for all existing records (created in old edition of the table)<br />Use DBMS_SQL.parse (with parameter Apply_Crossedition_Trigger set to name of trigger)<br />Use DBMS_PARALLEL_EXECUTE<br />
  66. 66. Multiple versions of Editioning View <br />Application A<br />Application B<br />Edition R3<br />View EMP (1.1)<br />… (minus ENAME)* Language<br />o FIRST_NAME<br />* LAST_NAME<br />Edition R1<br />Edition R2<br />View EMP (1.1)<br />…* Language <br />View EMP (1.0)<br />Table EMP_BASE<br />Reverse Crossedition Trigger<br />SAL<br />MGR<br />JOB<br />ENAME<br />LANGUAGE<br />FIRSTNAME<br />LASTNAME<br />HIREDATE<br />COMM<br />Forward CrosseditionTrigger<br />
  67. 67. “Suggested (best) Practices”<br />Every application (release) sets the Edition it requires when it connects to a session<br />At the same time it calls dbms_application_info<br />And sets other Context details<br />Applications should never access tables – all access should be through views<br />Only through views can the data structure itself be Editioned<br />Even triggers should be on the Editioning View<br />
  68. 68. Summary<br />11gR2 Editions are parallel, co-existing universes with incarnations of database objects<br />The new release can be constructed, tested and run in a new edition<br />The old edition can be switched off at cut-over <br />Editions also allow long time co-existence of multiple releases of an application<br />Application Upgrade no longer needs to disrupt the operation through planned downtime<br />
  69. 69. Conclusion<br />See http://www.amis.nl<br />To do an 11gR2 PoC together with us<br />To learn about 11gR2 training (DBA & Developer)<br />For more on database Migration services<br />See Blog for 11gR2 articles <br />http://technology.amis.nl/blog<br />Contact me: lucas.jellema@amis.nl<br />

×