It is inevitable that any book will contain mistakes. I found the first one while the book was still at the printers!

Errata & Addenda to the First Edition

Last Update: 27.6.2008

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14



xvi: The introduction omits a credit for Tom Gorman of SageLogix Inc. ( who also a technical reviewer of this book.

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 1


p5: Application Engine 'was rewritten in C++ so that it could also execute PeopleSoft PeopleCode'.

p23: .. the choice choice of emulation ...

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 2


p23: PSMONITORSRV was introduced in PeopleTools 8.44

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 3


p32: Owner ID/Access ID (SYSADM)
Access ID and Owner ID are not the same thing. Though by default the Owner ID is always an Access ID, it is theoretically possible for processes to connect to the same database in the same Owner ID schema via other Access ID users. The necessary privileges must be granted to the Access ID on objects in the Owner ID schema - see pages 47-48.

p43: after listing 3-12
The schema that contains the PeopleSoft database is referred to as the Access ID Owner ID.


p33: Listing 3-1 is an extract from the installation script grant.sql.

(6.1.2009) p35-7: The definition of the PSADMIN role delivered by PeopleSoft includes the IMP_FULL_DATABASE and BECOME_USER privilege.  Tanel Poder points out in his blog (Oracle Security: All your DBAs are SYSDBAs and can have full OS access) that these privileges could be used to gain SYSDBA access to the database.  This has bug fixed by the July 2008 CPU.  The morals of the story are not to grant powerful DBA privileges to application user accounts, and to keep up to date with CPUs!

(15.9.2009) p43: In the book I suggested that setting Oracle Terminated Connection Timeout (SQLNET.EXPIRE_TIME) is an option.  I now think this effectively a mandatory setting.  I recently wrote about this on my blog (see Oracle Terminated Connection Timeout).

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 4


p60: Comment for BUILDSEQNO
For instance, a table must be built before a view that references it, so the view will have a higher build sequence number.
For instance, a view must be built before a view that references it, so the referencing view will have a higher build sequence number than the referenced view.

p61: The wrong diagram has been printed for Figure 4-3.  It should be:

p69: Table 4-11. PeopleSoft Support Single-Byte character sets.

p71: Table 4-12. CLUSTERFLAG.  It would be more accurate to say that a clustered index on SQL Server and Sybase is similar to an Index Organised Table in Oracle.

p72: Table 4-15. ASCDESC: From PT8.48, PeopleSoft reintroduced descending key indexes (see Descending Indexes are back!)

p76: Search Record.
The search record specified in the component definition (PSPNLGRPDEFN) can be overridden on the menu item (PSMENUITEM).

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 5


p92. spelling.  RECSECCLASS should be ROWSECCLASS

p93. In the first bulleted paragraph, the 5th sentence should read:

So when a search record with a column called ROWSECCLASS with the search key attribute was encountered in the search record, the condition on RECSECCLASS ROWSECCLASS in the where clause was added automatically.

(27.10.2008) p94. In the second bulleted paragraph suggests that if the search criteria on a character column is the same length as the column then the Record Locator Dialogue produces an equality condition.  It doesn't do this in PeopleTools 8.48 (and possibly earlier), it produces an LIKE (see also Record Locator Dialogue Behaviour).

p111-2. It is not completely true to say that all character columns are NOT NULL. Long Character fields in PeopleSoft that are not defined as 'required' in the Application Designer are nullable in the database. Long Character field are created as LONG columns in the database unless their length is defined as between 1 and 2000 characters, in which case they are created as VARCHAR2 columns. So a long character field of between 1 and 2000 characters becomes a nullable VARCHAR2 column.  Therefore it is possible to create a sparse index on a nullable VARCHAR2 column.

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 6


p130: Listing 6-8. closing bracket missing after BUFFER POOL and before PCTFREE

p135: In listing 6-12 I have created the DDL Model parameters GTSPCOM1 and GTSPCOM2, but in Table 6-13 I reference NOSPCOM1 and NOSPCOM2.  These two should match the parameters in the DDL model.  In Listing 6-12 the GPSPCOM2 should occur before PCTFREE and PCTUSED because these two attributes are valid on a Global Temporary Table.

p139: From Oracle (see bug 2799028), function-based indexes no longer depend upon the QUERY_REWRITE_ENABLED and QUERY_REWRITE_INTEGRITY parameters.  However, the Oracle 9.2 documentation says they are necessary, and I have repeated this in the book.


(2.5.2008) p121-124.  The DDL models for gathering Cost-Based Optimizer statistics for Oracle have changed in PeopleTools 8.4.8 to use the DBMS_STATS.GATHER_TABLE_STATS procedure (see also Changes to DDL Models in PeopleTools 8.48).  The wrapper procedure (p122) is therefore obsolete.  However, if you want to use Dynamic Sampling on working storage tables in Application Engine programs then see %UpdateStats() -v- Optimizer Dynamic Sampling.

(2.4.2009) A new version of the wrapper (David Kurtz - Download Scripts) is available for use in the DDL Model from PeopleTools 8.48.  This now includes improved handling for partitioned objects.

(25.6.2009) An enhanced version of the wrapper (David Kurtz - Download Scripts) that permits different parameters to specified to the Oracle dbms_stats package for different PeopleSoft Records.  See Controlling How %UpdateStats Collects Optimizer Statistics.

(27.6.2007) p119: The DDL Model for creating indexes has changed in PT8.48.  Indexes are created NOLOGGING, then Application Designer issues a second command, that is not in the DDL model, to alter the index to LOGGING.  See my blog entry: Data Guard Implications of NOLOGGING operations from PeopleTools 8.48.

(26.4.2008) Tip: Migrating DDL Overrides with Application Designer

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 8


(1.7.2008) p168-170: A new built-in PeopleCode function, GetNextNumberWithGapsCommit, was introduced in PeopleTools 8.44 to assign sequence numbers and used from applications version 8.8.  It still works by incrementing the value of a piece of data in the database, and so could still suffer from lock contention, but this risk is minimized by performing the update is now done in a second database connection, and is immediately committed.  See blog entry Sequence Number Allocation in PeopleSoft.

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 9


p194, 2nd paragraph: In Listing 9-30, the access log shows that privately private query called DMK is executed, ...

p203: Listing 9-39.  The change to the exception is needed to terminate the autonomous transaction cleanly.
rem GRANT EXECUTE ON perfstat.sysadm TO sysadm;
rem GRANT EXECUTE ON sys.perfstat TO sysadm;


p174: Listing 9-2 & Footnote 4: There have been some small changes in the detail of client_info in PeopleTools 8.48.  Application server processes do not report the name of the Tuxedo Domain until they have handled a service request.  Process Scheduler processes never show the name of the domain. 

CLIENT_INFO                                                PROGRAM
---------------------------------------------------------- ----------------
PSAPPS,David,GO-FASTER-4,,PSAPPSRV.exe,                    PSAPPSRV.exe
PSAPPS,David,GO-FASTER-4,,PSPPMSRV.exe,                    PSPPMSRV.exe
PSAPPS,David,GO-FASTER-4,,PSPRCSRV.exe,                    PSPRCSRV.exe
PSAPPS,David,GO-FASTER-4,,PSMSTPRC.exe,                    PSMSTPRC.exe
PSAPPS,David,GO-FASTER-4,,PSDSTSRV.exe,                    PSDSTSRV.exe
PS,,GO-FASTER-4,,PSAESRV.exe,                              PSAESRV.exe
PS,10000                                                   sqrw.exe

(5.9.2008) p176: Listing 9-6 shows how to enable the Tuxedo service trace and specify the trace file name.  It shows the commands in the psappsrv.ubb file that is generated during domain configuration.  It would have been more useful to show how to how to put this into the psappsrv.ubx (although there is an example on p368).  T

CLOPT="{$Trace\TuxedoServiceTrace} -e {LOGDIR}{FS}APPQ.stderr {$PSAPPSRV\Spawn Server} -s@..{FS}psappsrv.lst -sICQuery -sSqlQuery:SqlRequest -- -C {CFGFILE} -D {$Domain Settings\Domain ID} -S PSAPPSRV"

This requires that you add a new variable 'TuxedoServiceTrace' to the Trace section of the psappsrv.cfg, so that the Tuxedo service trace can be controlled more easily. It has the value -r to enable trace, or a single space if not. 

The variable {LOGDIR} is the absolute path of the directory to which the log files are written.  This can be set during domain configuration should you wish to use a non-default location.

(27.6.2008) p203-4: Listing 9-39: I proposed a trigger on PSPRCSRQST to collect Statspack snapshots exactly when PeopleSoft processes start and finish.  A similar trigger is available for AWR snapshots.

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 10


p241: There is an arrow missing in Figure 10-8 from PSPPMSRV to the database, indicating that this server process inserts data into the database.

p243: Table 10-2: Description for PM_TRANS_DEFN_SET should read "See PS_TRANS_DEFN."

p245: Figure 10-10: PSTRANSHIST should be PSPMTRANSHIST.

p249: Figure 10-11: PSEVENTHIST should be PSPMEVENTHIST.


p240: Since the book was written I have used the Performance Monitor in real production situations.  Further information can be found in my presentation PeopleSoft: A Properly Instrumented Application?

In Figures 10-10 and 10-11, I could also have shown that PSPMMETRICDEFN is joined to PSPMMETRICVALUE to obtain information about look-up values for numeric identifier metrics.

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 11


p267: To disable tracing, use one of the following:
EXECUTE sys.dbms_monitor.session_trace_enable(<sid>,<serial#>,waits=>FALSE, binds=>FALSE);
EXECUTE sys.dbms_monitor.session_trace_disable;


(25.5.2008) p269-70, listing 11-6: A new version of the trace trigger is proposed.  See entry for chapter 14 below

(31.3.2010) p291, One exception where Stored Outlines might be of use is Global Payroll.  See blog entry: Oracle Plan Stability (Stored Outlines) in PeopleSoft Global Payroll.

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 12


p322: In the formula for MAXSERVICES, the 7th term should read:
+ 2n_ + 5n...
+2n2 + 5n...

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 13


p363: The following index has been found to improve the performance of the concurrency calculation.

CREATE index txrpt_idx2
ON txrpt(

(4.9.2008) p37?: From PeopleTools 8.48, there is an option in the psadmin utility that will purge the cache of an application server.  This option can also be invoked from the command line

 psadmin -c purge -d  [-noarch | -arch ] [-log <"log_commnts">
   where 'domain' specifies domain name in PS_HOME and
         'archive_directory' specifies location to which to quarantine the purged cache,
         'log_comments' specifies any comments to be added to the purge cache log entry

Listing 13-16 exhibits part of the script, but this script is not in the zipped bundle of scripts available on the Apress website.  The script can now be downloaded from the Go-Faster website.  Nor does this section properly explain how to use this script to clear the application server cache without shutting down the whole application server.  See the PeopleSoft DBA Blog entry, 'How to Clear the Application Server Cache Without Shutting it Down' for a full description.

(17.6.2010) Blog posting: Configuring Large PeopleSoft Application Servers

Chapters 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Chapter 14


p390, p404: It is only an option to run Application Engine as a Tuxedo server process from PeopleTools 8.44, although it is the default option.  If this server is not configured then the process scheduler  initiates psae, the standalone executable, as in previous versions of PeopleTools.  PSAESRV, the Application Engine server, is designed for use in environments with a very large number of short application engine processes, typically CRM systems.  The server processes does not have to be instantiated and negotiate PeopleSoft sign-on security for each process request.

(25.5.2008) p404: In Chapter 11 (p269-70, listing 11-6) I suggest using a database trigger to enable SQL Trace, then for Application Engine processes, in case they are run with the PSAESRV process, I introduce a further trigger to disable trace when the process terminates.  This is not a good idea because the cursors opened by the Application Engine program are still open when the process status is changed from 7 (processing) to 9 (success) or 3 (error) when the unset_trace trigger fires and disables SQL Trace, and consequently the STAT lines for these cursors are never emitted to the trace file.  The STAT lines contain the execution plans and a wealth of other information.

Instead, I have a new version of the trace trigger which disables trace if not wanted when an application engine process starts.  For more details see blog entry: Enabling Oracle Database Trace on PeopleSoft processes with a Trigger (improved).

Thus, if a PSAESRV process has been tracing, trace is only disabled when the next request is begun.  This has the advantage that the stat lines for the cursors are written to the trace file.  The disadvantage is that the process continues to trace between requests, and the time between requests is reported as 'SQL*Net message from client'.

(11.6.2010) Blog posting: Life Cycle of a Process Request

If you find other errors, please:

 David Kurtz 2015