2. Agenda
1 Serving a need
2 What PLSQL Commons can do for you
3 How you can make a difference
Page 2 PLSQL Commons v1.0
3. Serving a need
Reusable PLSQL Components
PLSQL Commons is a project focused on creating and maintaining
reusable PLSQL components.
Components that will enrich the PLSQL programmer's toolkit
Components that promote the programmers shift from solving purely
technical problems to actual business problems
Page 3 PLSQL Commons v1.0
4. Serving a need
Reusable PLSQL Components
PLSQL Commons is used by a CRM service provider of General Motors
to handle their specific needs
Used on their production Oracle database servers as the defacto standard
components for the past three years
Page 4 PLSQL Commons v1.0
5. What PLSQL Commons can do for you
Current status
Practical applications
Page 5 PLSQL Commons v1.0
6. Current Status
There are several upcoming sandbox components not mentioned.
This presentation will focus on just a few components.
Component Focus
plsql_async Parallel processing of tasks
plsql_cache General purpose memory based caching
plsql_error Exception management
plsql_file Reading and writing operating system text files
plsql_ftp Copy a file from one host to another based on the ftp protocol.
plsql_host Executing a command in the host environment
plsql_log Logging application behavior
plsql_match Text search engine
plsql_test Writing repeatable unit tests
plsql_timeit Measuring the execution time of a program unit
plsql_util General purpose utilities
plsql_soap Lightweight webservices based on the soap protocol
Page 6 PLSQL Commons v1.0
7. Practical Applications
Parallel processing of tasks
Imagine a potential pipeline of an ETL process to load CRM data.
The pipeline passes several processing elements.
Page 7 PLSQL Commons v1.0
8. Practical Applications
Parallel processing of tasks
If the elements Address and Communication are independent.
The pipeline could be organized to process these elements in parallel
Page 8 PLSQL Commons v1.0
9. Practical Applications
Parallel processing of tasks
Fundamental questions :
• How can you maintain the processing flow?
• What if Address and Communication would like to pass their identifiers?
Page 9 PLSQL Commons v1.0
10. Practical Applications
Parallel processing of tasks
The answers provided :
- plsql_async can be used to route and maintain the processing flow
- plsql_async can be used to pass information between sequential processes
- plsql_cache can be used to cache session and cross-session based information
Read the user guide for more details on this.
If your interest in building a processing flow. Read the book Enterprise Integration Patterns.
Page 10 PLSQL Commons v1.0
11. Practical Applications
Exception management
Assertion at any location you assume will not be reached.
gender char(1) := 'A';
plsql_test.assert(gender in ('M','F'),'Gender can be M or F; current value is {1}',varchars_t(gender));
Error to identify an exceptional condition that an application might want to catch
soapFaultReason varchar2(100) := ImportDataRecord has been invoked at an illegal or inappropriate time.';
err.raise(err.SOAPFaultException,'operation raised exception : {1}',varchars_t(soapFaultReason));
Page 11 PLSQL Commons v1.0
12. Practical Applications
Testing application behavior
plsql_test is a testing facility for the plsql programming
plsql_test will help you :
- measure your progress, spot unintended side effects, and focus your
development efforts
- without automated testing tools like this facility retesting can be a tedious and
inaccurate process.
- by allowing the testing process to occur frequently and automatically, you can
keep software coding errors at a minimum
Page 12 PLSQL Commons v1.0
13. Practical Applications
Testing application behavior
Developing a test suite
create package body test_plsql_util_pck
as
procedure t_varchars
is
vt1 varchars_t:= new varchars_t('A','B');
begin
plsql_test.assert(vt1.count = 2,'list contains only two elements');
end;
procedure t_isWhiteSpace
is
cause varchar2(2000) := 'incorrect implementation of contract';
begin
plsql_test.assert(putil.isWhiteSpace(' '),cause); -- a space is whitespace
plsql_test.assert(not putil.isWhiteSpace(null),cause); -- null is not whitespace
plsql_test.assert(not putil.isWhiteSpace(''),cause); -- empty string is not whitespace
end;
end;
Each and every package can become a test suite.
- Just add a few procedures with prefix t_ to turn it into a test suite.
- Once that's done. It can be run as a test suite.
Page 13 PLSQL Commons v1.0
14. Practical Applications
Testing application behavior
Running a test suite DBMS Output
===== Run Test Suite ====
plsql_test.runTestSuite unit TST_PLSQL_UTIL_PCK.T_ISWHITESPACE succeeded
( module => 'test_plsql_util_pck unit TST_PLSQL_UTIL_PCK.T_VARCHARS succeeded
, runAll => true ===== Test Report =====
); Run 2 tests of which 2 succeeded and 0 failed
Page 14 PLSQL Commons v1.0
15. Practical Applications
Logging application behavior
Sneak Preview DBMS Output
20110113-10:47:45.228 INFO gender is M
plog.turn_on;
gender char(1) := 'M';
plog.info('gender is {1}',varchars_t(gender));
Logging supports
- Different layout types : text, rich_text, custom
- Different output types : dbms_pipe, dbms_output, http, table
- Different levels of logging : trace, debug, info, info, warn, error, fatal
Read the userguide for more details on this.
Page 15 PLSQL Commons v1.0
16. Practical Applications
Measuring application behavior
Sneak Preview
number idx;
plsql_timeit.remove;
plsql_timeit.start_watch(pp_context => 'assignment');
idx := 1;
plsql_timeit.stop_watch(pp_context => 'assignment');
plog.info('took {1} millisec',varchars_t(mmit_plsql_timeit_pck.period(pp_context => 'assignment',pp_total => true));
plsql_timeit is a facility to measure the execution time of a program unit
- measure if the execution time of your code is fit for use
plsql_timeit and plsql_test could be combined to introduce
load, volume, overload and stress test functionality.
Page 16 PLSQL Commons v1.0
17. Practical Applications
General purpose utilities
Sneak Preview
var varchar2(200) := chr(10); -- new line
isWhiteSpace boolean := putil.isWhiteSpace(var);
plog.info(putil.toChar(isWhiteSpace));
The standard libraries fail to provide enough general purpose methods.
plsql_util provides these methods
Page 17 PLSQL Commons v1.0
18. Practical Applications
General purpose utilities
Sneak Preview
list StringList := new StringList('el2','el1');
list := putil.sort(list);
val varchar2(32767) := putil.join(list,'#');
list := putil.split(val,'#');
The standard libraries fail to provide enough general purpose methods.
plsql_util provides these methods
Page 18 PLSQL Commons v1.0
19. Practical Applications
General purpose utilities
Sneak Preview
list StringList := new StringList('el2','el1');
list := putil.sort(list);
val varchar2(32767) := putil.join(list,'#');
list := putil.split(val,'#');
The standard libraries fail to provide enough general purpose methods.
plsql_util provides these methods
Page 19 PLSQL Commons v1.0
20. How you can make a difference
Give it a try
Be a happy user
Tell us and the whole wide world about it!
If you would like to get in touch.
Drop me a mail at arnold@reuser.info
Page 20 PLSQL Commons v1.0
21. Do You Have
Any Questions?
We would be happy to help.
Page 21 PLSQL Commons v1.0