<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
    <title>PHP and Oracle: Christopher Jones</title>
  <link>https://blogs.oracle.com/opal/</link>
      
    <description>Notes on the Oracle PHP Apache Linux ("OPAL") stack, with bits of Python, Perl and Ruby for good luck</description>
  <language>en-us</language>
  <copyright>Copyright 2012</copyright>
  <lastBuildDate>Wed, 14 Mar 2012 22:35:58 -0500</lastBuildDate>
    <generator>Apache Roller BLOGS401ORA4 (20120203073044)</generator>
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ChristopherJonesOnOpal" /><feedburner:info uri="christopherjonesonopal" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_fpm_fastcgi_process_manager</guid>
    <title>PHP-FPM FastCGI Process Manager with Apache 2</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/nlY3egHpBq8/php_fpm_fastcgi_process_manager</link>
        <pubDate>Tue, 13 Mar 2012 23:00:00 -0500</pubDate>
    <category>php</category>
    <category>apache</category>
    <category>fastcgi</category>
    <category>php</category>
    <category>php-fpm</category>
    <category>server</category>
    <category>web</category>
            <description>&lt;p&gt;I've &lt;a href="https://blogs.oracle.com/opal/entry/php_5_4_0_rpms"
&gt;published some vanilla PHP 5.4.0 RPMs&lt;/a&gt; to make new feature testing
easier.&lt;/p&gt;

&lt;p&gt;Along with all the PHP 5.4 goodies, the php-fpm "FastCGI Process
Manager" is available for the first time on oss.oracle.com.  Php-fpm
is an alternative FastCGI interface to PHP with various extra features
such as load dependent spawning of processes.  (For other features,
see &lt;a href="http://php-fpm.org/"&gt;php-fpm.org&lt;/a&gt;).  Php-fpm
has been getting more and more traction in the PHP community and the
EXPERIMENTAL flag was removed in PHP 5.4.  You might want to test it
out.&lt;/p&gt;

&lt;p&gt;To use php-fpm with the default Apache web server, first install
Oracle Linux 5.8 (64bit) using Oracle's free, public yum repository &lt;a
href="http://public-yum.oracle.com/"
&gt;public-yum.oracle.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Install Apache, if not already installed:&lt;/p&gt;

&lt;pre&gt;
  yum install httpd
&lt;/pre&gt;

&lt;p&gt;Download and install the PHP 5.4 RPMs from &lt;a
href="http://oss.oracle.com/projects/php/"
&gt;oss.oracle.com/projects/php&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;
  rpm -i php54-common-5.4.0-1.el5.x86_64.rpm php54-fpm-5.4.0-1.el5.x86_64.rpm
&lt;/pre&gt;

&lt;p&gt;Other extensions can also be installed, depending on the functionality
you want to test.&lt;/p&gt;

&lt;p&gt;Download and build FastCGI for Apache:&lt;/p&gt;

&lt;pre&gt;
  wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
  tar -zxf mod_fastcgi-current.tar.gz
  cd mod_fastcgi-2.4.6
  cp Makefile.AP2 Makefile
  make top_dir=/usr/lib64/httpd
&lt;/pre&gt;

&lt;p&gt;Install FastCGI as root:&lt;/p&gt;

&lt;pre&gt;
  make top_dir=/usr/lib64/httpd install
&lt;/pre&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/httpd/conf/httpd.conf&lt;/code&gt; and comment out any
existing references to PHP you might previously have added for
testing: &lt;/p&gt;

&lt;pre&gt;
# LoadModule php5_module        modules/libphp5.so
# AddType application/x-httpd-php .php
&lt;/pre&gt;

&lt;p&gt;Add the php-fpm configuration to &lt;code&gt;httpd.conf&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;
  LoadModule fastcgi_module modules/mod_fastcgi.so

  &amp;lt;IfModule mod_fastcgi.c&amp;gt;  
    FastCGIExternalServer /usr/sbin/php-fpm -host 127.0.0.1:9000
    AddHandler php-fastcgi .php  

    #&amp;lt;LocationMatch "/status"&amp;gt;
    #  SetHandler php-fastcgi-virt
    #  Action php-fastcgi-virt /usr/sbin/php-fpm.fcgi virtual
    #&amp;lt;/LocationMatch&amp;gt;

    Action php-fastcgi /usr/sbin/php-fpm.fcgi  
    ScriptAlias /usr/sbin/php-fpm.fcgi /usr/sbin/php-fpm  

    &amp;lt;Directory /usr/sbin&amp;gt;  
      Options ExecCGI FollowSymLinks  
      SetHandler fastcgi-script  
      Order allow,deny  
      Allow from all  
    &amp;lt;/Directory&amp;gt;  
  &amp;lt;/IfModule&amp;gt; 
&lt;/pre&gt;

&lt;p&gt;Start php-fpm and Apache:&lt;/p&gt;

&lt;pre&gt;
  service php-fpm start
  service httpd start
&lt;/pre&gt;

&lt;p&gt;Test it out with your favorite script or create a file &lt;code&gt;pi.php&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;
  &amp;lt;?php
    phpinfo();
  ?&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Save it in &lt;code&gt;/var/www/html/pi.php&lt;/code&gt; or in
&lt;code&gt;$HOME/public_html/pi.php&lt;/code&gt;, if you have configured
&lt;code&gt;UserDir&lt;/code&gt; in &lt;code&gt;httpd.conf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In a browser load &lt;code&gt;http://localhost/pi.php&lt;/code&gt; or
&lt;code&gt;http://localhost/~yourname/pi.php&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This will show the PHP configuration values.&lt;/p&gt;

&lt;p&gt;To test php-fpm's built-in statistics, edit &lt;code&gt;httpd.conf&lt;/code&gt;
and uncomment the four lines of the &lt;code&gt;LocationMatch&lt;/code&gt;
section:&lt;/p&gt;

&lt;pre&gt;
  &amp;lt;LocationMatch "/status"&amp;gt;
    SetHandler php-fastcgi-virt
    Action php-fastcgi-virt /usr/sbin/php-fpm.fcgi virtual
  &amp;lt;/LocationMatch&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/php-fpm.conf&lt;/code&gt; and uncomment the line:&lt;/p&gt;

&lt;pre&gt;
  pm.status_path = /status
&lt;/pre&gt;

&lt;p&gt;Restart php-fpm and Apache:&lt;/p&gt;

&lt;pre&gt;
  service php-fpm restart
  service httpd restart
&lt;/pre&gt;

&lt;p&gt;Run some load on the system:&lt;/p&gt;

&lt;pre&gt;
  ab -c 10 -t 60 http://localhost/pi.php  
&lt;/pre&gt;

&lt;p&gt;Now &lt;code&gt;http://localhost/status&lt;/code&gt; gives you the status of the server:&lt;/p&gt;

&lt;pre&gt;
  pool:                 www
  process manager:      dynamic
  start time:           13/Mar/2012:14:25:53 -0700
  start since:          26
  accepted conn:        50001
  listen queue:         0
  max listen queue:     6
  listen queue len:     128
  idle processes:       2
  active processes:     1
  total processes:      3
  max active processes: 5
  max children reached: 1
&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;php-fpm.conf&lt;/code&gt; file documents other output formats
for the statistics.  It also shows the extensive functionality
available with php-fpm.&lt;/p&gt;

&lt;p&gt;Documentation on php-fpm is not ideal, but you can see some at &lt;a
href="http://php.net/manual/en/install.fpm.php"
&gt;http://php.net/manual/en/install.fpm.php&lt;/a&gt;.  The &lt;a
href="http://php-fpm.org" &gt;php-fpm.org&lt;/a&gt; site has more,
including a &lt;a href="http://groups.google.com/group/highload-php-en"
&gt;forum&lt;/a&gt; and &lt;a href="http://php-fpm.org/wiki/Main_Page" &gt;wiki&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;Php-fpm is commonly used in conjunction with the nginx webserver.
For this, you will need to compile nginx yourself.  Because php-fpm is
installed and managed separately from the webserver, the php-fpm RPM
will still be usable.  Now that Apache 2.4 has been released with
claims of improved performance, it will be interesting to see if web
server popularity swings back towards Apache.&lt;/p&gt;

&lt;p&gt;Finally, remember that the PHP RPMs on oss.oracle.com are for
testing purposes only. They are not supported.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/nlY3egHpBq8" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_fpm_fastcgi_process_manager</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_5_4_0_rpms</guid>
    <title>PHP 5.4.0 RPMs for 64bit Oracle Linux 5.x are available</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/0vWEd0slwD8/php_5_4_0_rpms</link>
        <pubDate>Tue, 13 Mar 2012 22:06:43 -0500</pubDate>
    <category>php</category>
    <category>feature</category>
    <category>install</category>
    <category>linux</category>
    <category>new</category>
    <category>php</category>
    <category>release</category>
    <category>rpm</category>
            <description>&lt;p&gt;I've published some vanilla PHP 5.4.0 RPMs to make new feature
testing easier for Oracle Linux 5.x 64 bit users.  The standard set of
RPMs is at &lt;a href="http://oss.oracle.com/projects/php/"
&gt;oss.oracle.com/projects/php&lt;/a&gt;.  The OCI8 extension is also
available (this requires the free Oracle Instant Client 11.2 from &lt;a
href="http://linux.oracle.com/" &gt;ULN&lt;/a&gt; or &lt;a
href="http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html"
&gt;OTN&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Some of the features of PHP 5.4 are:&lt;/p&gt;

&lt;ul&gt;

  
  &lt;li&gt;&lt;p&gt;Improved memory usage and performance. Some impressive
preliminary reports of the benefits include:
&lt;a href="http://news.php.net/php.internals/57760" &gt;http://news.php.net/php.internals/57760&lt;/a&gt; and
&lt;a href="http://news.php.net/php.internals/57747" &gt;http://news.php.net/php.internals/57747&lt;/a&gt;.
    &lt;/p&gt;&lt;/li&gt;

    &lt;li&gt;&lt;p&gt;File Upload progress support is natively implemented.&lt;/p&gt;&lt;/li&gt;

    &lt;li&gt;&lt;p&gt;Support for Traits now allows code reuse:&lt;/p&gt;

&lt;pre&gt;
    trait t1 {
	function m1() { echo "hi"; }
	function m2() { echo "bye"; }
    }

    class my_c1 {
	use t1;
	/*...*/
    }

    class my_c2 extends c2 {
	use t1;
	/*...*/
    }
&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;A built-in HTTP server for development is included:&lt;/p&gt;
&lt;pre&gt;  php -S 127.0.0.1:8888
&lt;/pre&gt;
  &lt;/li&gt;
  
  &lt;li&gt;&lt;p&gt;Improvements were made to the interactive PHP shell (when PHP is
compiled with readline).&lt;/p&gt;
    &lt;/li&gt;
    
    &lt;li&gt;&lt;p&gt;A shortened array syntax was introduced: &lt;code&gt;$a = [1,2,3];&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

    &lt;li&gt;&lt;p&gt;The default character set for several internal functions was changed to UTF-8.&lt;/p&gt;&lt;/li&gt;

    &lt;li&gt;&lt;p&gt;Support for multibyte languages is now configurable at run-time
instead of compile-time.&lt;/p&gt;
      &lt;/li&gt;
      
      &lt;li&gt;&lt;p&gt;The value echo tag "&lt;code&gt;&amp;lt;?=&lt;/code&gt;" is now always on.&lt;/p&gt;&lt;/li&gt;

      &lt;li&gt;&lt;p&gt;Binary number support was added.&lt;/p&gt;&lt;/li&gt;

      &lt;li&gt;&lt;p&gt;DTrace support was added.&lt;/p&gt;&lt;/li&gt;

      &lt;li&gt;&lt;p&gt;A new typehint indicates a function argument must be callable.&lt;/p&gt;&lt;/li&gt;

      &lt;li&gt;&lt;p&gt;Session entropy uses &lt;code&gt;/dev/urandom&lt;/code&gt; or
&lt;code&gt;/dev/arandom&lt;/code&gt; by default for extra security if either is
	present at compile time.&lt;/p&gt;&lt;/li&gt;

	&lt;li&gt;&lt;p&gt;Function call results can now be immediately dereferenced as arrays:
	  &lt;code&gt;foo()[0]&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

	  &lt;li&gt;&lt;p&gt;Class members can be accessed on instantiation: &lt;code&gt;(new foo)-&gt;method()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;
  
&lt;p&gt;For more changes see the &lt;a href="http://php.net/migration54"
&gt;migration documentation&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/0vWEd0slwD8" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_5_4_0_rpms</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_5_4_is_out</guid>
    <title>PHP 5.4 is out; your work begins now</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/Gqib2TqqBDk/php_5_4_is_out</link>
        <pubDate>Fri, 2 Mar 2012 01:57:20 -0600</pubDate>
    <category>php</category>
            <description>&lt;p&gt;Exciting news: PHP 5.4 is out.  Thanks to the release managers Stas
&amp;amp; David for making it happen.  The PHP code is syncing to mirrors.
PHP documentation will take a day or two to build &amp;amp; sync.  Take a
look when it reaches you. &lt;/p&gt;

&lt;p&gt;The &lt;a href="http://php.net/releases/5_4_0.php" &gt;announcement&lt;/a&gt;
lists some of the features that have changed.&lt;/p&gt;

&lt;p&gt;There is a current tidy up of documentation for new features and
migration happening.  There are some low priority bug fixes that are
waiting merge.  These came in during the extended release process and
were left out to avoid destabilizing the code.&lt;/p&gt;

&lt;p&gt;Some PECL extensions still need to make PHP 5.4 compatible
releases.  Rasmus &lt;a
href="http://twitter.com/#!/rasmus/status/175355782961963008" &gt;helped
out&lt;/a&gt; by making changes to some extension, but the package owners
need to bundle up releases.  Other extensions may need some work.&lt;/p&gt;

&lt;p&gt;XDebug is due for a compatible release &lt;a
href="http://twitter.com/#!/xdebug/status/175354232176787456"
&gt;soon&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;PHPUnit is said to be &lt;a
href="http://twitter.com/#!/s_bergmann/status/175360254773694464"
&gt;fine&lt;/a&gt; already.&lt;/p&gt;

&lt;p&gt;APC has at least one &lt;a
href="http://svn.php.net/viewvc?view=revision&amp;amp;revision=323587"
&gt;pending fix&lt;/a&gt; too, for the "?:" operator.&lt;/p&gt;

&lt;p&gt;In summary, PHP 5.4 is available and I expect this branch will stabilize
quickly.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/Gqib2TqqBDk" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_5_4_is_out</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_virtualbox_vm_has_been</guid>
    <title>PHP VirtualBox VM has been refreshed</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/_QEHzvYrP3Q/php_virtualbox_vm_has_been</link>
        <pubDate>Thu, 19 Jan 2012 13:19:05 -0600</pubDate>
    <category>php</category>
    <category>database</category>
    <category>oracle</category>
    <category>php</category>
    <category>virtualbox</category>
    <category>vm</category>
    <category>xe</category>
            <description>&lt;p&gt;While I was recently on summer vacation (yes, it is summer in half
the world), the VirtualBox VM for PHP was refreshed to a more recent
Zend Server/Oracle Linux/Oracle Database XE stack.&lt;/p&gt;

&lt;p&gt;I just pulled the VM down, imported it and had it booting and
serving PHP pages in a very few minutes.  VirtualBox really is
marvelous.  There is a link to download the VM near the foot of the &lt;a
href="http://www.oracle.com/technetwork/community/developer-vm/index.html"
&gt;Oracle Technology Network Developer VM page&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/_QEHzvYrP3Q" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_virtualbox_vm_has_been</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_5_3_9_rpms</guid>
    <title>PHP 5.3.9 RPMs Available for Testing</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/mrMAx-4yGOQ/php_5_3_9_rpms</link>
        <pubDate>Thu, 12 Jan 2012 20:06:44 -0600</pubDate>
    <category>php</category>
    <category>install</category>
    <category>php</category>
    <category>release</category>
            <description>&lt;p&gt;I've updated my relatively "vanilla" PHP 5 RPMs to 5.3.9 on &lt;a
href="http://oss.oracle.com/projects/php/"&gt;oss.oracle.com/projects/php&lt;/a&gt;.
They are built for Oracle Linux 5.7 (and RHEL 5.7).  I've included the
OCI8 extension for Oracle DB, of course.  The various MySQL extension
are there and use the mysqlnd driver, so installation doesn't require
any client-side MySQL libraries.  Note the PHP 5.3.9 RPMs are for
testing only.  For production users I recommend &lt;a
href="http://www.oracle.com/technetwork/topics/php/zend-server-096314.html"
&gt;Zend Server&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/mrMAx-4yGOQ" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_5_3_9_rpms</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_oci8_1_4_7</guid>
    <title>PHP OCI8 1.4.7 is available on PECL</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/AWDc5GoINWU/php_oci8_1_4_7</link>
        <pubDate>Wed, 11 Jan 2012 13:37:37 -0600</pubDate>
    <category>php</category>
    <category>php</category>
    <category>release</category>
            <description>&lt;p&gt;Following on the heels of the &lt;a
href="http://www.php.net/archive/2012.php#id2012-01-11-1" &gt;PHP
5.3.9&lt;/a&gt; release, I've bundled &lt;a href="http://pecl.php.net/package/oci8/1.4.7"
&gt;OCI8 1.4.7 for PECL&lt;/a&gt;.  The PECL OCI8 1.4.7 code is the same as
included in PHP 5.3.9 and can be used to update older PHP installations.  The release notes are &lt;a
href="http://pecl.php.net/package-changelog.php?package=oci8&amp;release=1.4.7"
&gt;here&lt;/a&gt;. There are several bug fixes; upgrading is recommended.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/AWDc5GoINWU" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_oci8_1_4_7</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_oci_password_change_ora</guid>
    <title>PHP oci_password_change() ORA-1017 gotcha with Oracle Database 11.2.0.3</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/uWK5GmRZlPE/php_oci_password_change_ora</link>
        <pubDate>Mon, 24 Oct 2011 18:27:45 -0500</pubDate>
    <category>php</category>
    <category>client</category>
    <category>instant</category>
    <category>password</category>
    <category>php</category>
    <category>upgrade</category>
            <description>&lt;p&gt;The Oracle &lt;a
href="http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html"
&gt;Instant Client&lt;/a&gt; 11.2.0.3 for Linux is now available on OTN.  I
know many users will upgrade sooner rather than later to get the
"latest and greatest" release.&lt;/p&gt;

&lt;p&gt;However, if your PHP application uses &lt;tt&gt;&lt;a
href="http://www.php.net/manual/en/function.oci-password-change.php"
&gt;oci_password_change&lt;/a&gt;&lt;/tt&gt; (or its old alias
&lt;tt&gt;ocipasswordchange&lt;/tt&gt;), you should upgrade the client libraries
(Instant or normal "full" client) and the Oracle Database version to
11.2.0.3 at the same time.  Otherwise &lt;tt&gt;oci_password_change&lt;/tt&gt;
will fail with the error "ORA-1017: invalid username/password".  If
you're not using &lt;tt&gt;oci_password_change&lt;/tt&gt; then this won't impact
you.&lt;/p&gt;

&lt;p&gt;Since the protocol change is in the Oracle libraries, the change is
not just limited PHP. Any C program using Oracle's Call Interface
"OCIPasswordChange" API to change passwords will also have the same
restrictions.  &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/uWK5GmRZlPE" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_oci_password_change_ora</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/scripting_language_related_sessions_at</guid>
    <title>Scripting Language Related Sessions at Oracle OpenWorld and JavaOne, October 2011 </title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/ziyua5EiiaQ/scripting_language_related_sessions_at</link>
        <pubDate>Mon, 26 Sep 2011 23:50:29 -0500</pubDate>
    <category>php</category>
    <category>conference</category>
    <category>development</category>
    <category>javaone</category>
    <category>language</category>
    <category>oow</category>
    <category>openworld</category>
    <category>oracle</category>
    <category>perl</category>
    <category>php</category>
    <category>programming</category>
    <category>python</category>
    <category>rails</category>
    <category>ruby</category>
    <category>scripting</category>
    <category>sessions</category>
    <category>tuxedo</category>
            <description>&lt;p&gt;Oracle OpenWorld and JavaOne conferences are happening in San
Francisco next week. It will be a busy and exciting time.&lt;/p&gt;

&lt;p&gt;First, here's a shout out: For me the conference kicks off on Sunday morning.
Marcelle Kratochvil from Piction (heavy users of PHP and
Oracle DB) is hosting the inaugural &lt;strong&gt;Unstructured Data with Multimedia
SIG&lt;/strong&gt; for Oracle Database and MySQL database (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=32440"
&gt;32440&lt;/a&gt;) Sunday 9:00 am in Moscone West room 2011.&lt;/p&gt;

&lt;p&gt;Below are some of the scripting and related
sessions happening during the week.
&lt;/p&gt;
&lt;h3&gt;Exhibition Hall&lt;/h3&gt;

&lt;p&gt;During the Exhibition Hall hours, come and talk to us at the
&lt;strong&gt;Database Access Services and APIs&lt;/strong&gt; booth.  This year
we're in Moscone South, Left SL-067.  The &lt;strong&gt;Tuxedo&lt;/strong&gt; application server
booth is Moscone South, Right - SR-202.  At JavaOne look out for the
&lt;strong&gt;NetBeans&lt;/strong&gt; booth, Hilton San Francisco - HHJ-023.  &lt;/p&gt;

&lt;h3&gt;Scripting Sessions, Birds-of-a-Feather Meetings, and Hands-on-Labs at OOW&lt;/h3&gt;

&lt;ul&gt;

  &lt;li&gt;The Oracle Tuxedo team has scripting language support in their powerful application server environment:&lt;br&gt;
&lt;strong&gt;High-Performance Web Applications with
C/C++/PHP/Python&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=15705"&gt;15705&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Monday, 05:00 PM, Moscone South - 300&lt;/i&gt; &lt;/li&gt;

&lt;li&gt; This year we are running introductory Hands-on Lab sessions
for three languages concurrently.  Come along and choose which
language you'd like to dip your toes into: &lt;br&gt;&lt;strong&gt;Develop and
Deploy High-Performance Web 2.0 PHP, Ruby, or Python
Applications&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=30082"
&gt;30082&lt;/a&gt;)
  &lt;br&gt;&lt;i&gt;Monday, 05:00 PM, Marriott Marquis - Salon 10/11&lt;/i&gt; &lt;/li&gt;

  &lt;li&gt;Come and ask questions at the round table Birds-of-a-Feather session:&lt;br&gt;
&lt;strong&gt;Meet the Oracle Database Clients Developers: C, C++, PHP,
Python, Ruby, and Perl&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=26240"&gt;26240&lt;/a&gt;)
    &lt;br&gt;&lt;i&gt;Monday, 07:30 PM, Marriott Marquis - Salon 8&lt;/i&gt; &lt;/li&gt;

&lt;li&gt; My overview and state-of-the-nation session is: &lt;br&gt;&lt;strong&gt;PHP, Ruby, Python, and Perl: Develop and Deploy
Mission-Critical Apps with Oracle Database 11g&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=14704"&gt;14704&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Wednesday, 11:45 AM, Marriott Marquis - Salon 8&lt;/i&gt; &lt;/li&gt;

&lt;li&gt;The Tuxedo team Hands-on-Lab lets you code in C/C++/PHP/Python/Ruby: &lt;br&gt;&lt;strong&gt;Develop High-Performance, Service-Oriented C/C++ Applications for Oracle Exalogic&lt;/strong&gt; (&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=31120"&gt;31120&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Thursday, 12:00 PM, Marriott Marquis - Salon 3/4&lt;/i&gt;&lt;/li&gt;

&lt;li&gt;Raimonds Simanovskis, maintainer of the Rails adapter for Oracle
is giving a session: &lt;br&gt;&lt;strong&gt;Extending Oracle E-Business Suite with
Ruby on Rails&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=8604"&gt;8604&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Thursday, 03:00 PM, Moscone West - 2002/2004&lt;/i&gt; &lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Several other sessions discuss topics that scripting language devotees will find invaluable:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;
  &lt;strong&gt;Build, Deploy, and Troubleshoot Highly Performant, Highly Available Apps with Oracle Database&lt;/strong&gt; (&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=14703" &gt;14703&lt;/a&gt;)
  &lt;br&gt;&lt;i&gt;Wednesday, 05:00 PM, Moscone South - 303&lt;/i&gt;
&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Net Services: Best Practices for Performance, Scalability, and High Availability&lt;/strong&gt; (&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=14345"&gt;14345&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Wednesday, 01:15 PM, Moscone South - 303&lt;/i&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Also check out the full Oracle Tuxedo application server schedule &lt;a
href="https://blogs.oracle.com/Tuxedo/entry/oracle_tuxedo_at_oow_2011"
&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Scripting at JavaOne&lt;/h3&gt;
&lt;p&gt;Over in the concurrent JavaOne conference there are several scripting
sessions driven by San Francisco's &lt;a
href="http://www.engineyard.com/blog/2011/its-all-about-jruby/"&gt;EngineYard&lt;/a&gt;.  This year they have JRuby sessions

but with their &lt;a href="http://www.engineyard.com/orchestra" &gt;recent
aquisition&lt;/a&gt; of PHP technnology, I hope they'll have more on PHP
in one of the OOW streams next year:&lt;/p&gt;


&lt;ul&gt;

  &lt;li&gt;&lt;strong&gt;Accelerate Your Business and Aim for the Cloud with Java and
  JRuby&lt;/strong&gt; (&lt;a
  href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=25284"&gt;25284&lt;/a&gt;)&lt;br&gt;Wednesday, 03:00 PM, Parc 55 - Embarcadero&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;From Java to Rails: Techniques for Adding Ruby Agility to Your
  Java Web Stack&lt;/strong&gt; (&lt;a
  href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=24582"&gt;24582&lt;/a&gt;)&lt;br&gt;Monday, 05:30 PM, Parc 55 - Market Street&lt;/li&gt;
			
  &lt;li&gt;&lt;strong&gt;Real-World JRuby&lt;/strong&gt; (&lt;a
  href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=23600"&gt;23600&lt;/a&gt;)&lt;br&gt;Wednesday, 04:30 PM, Parc 55 - Market Street&lt;/li&gt;
			
  &lt;li&gt;&lt;strong&gt;Script Bowl 2011: A Scripting Languages Shootout&lt;/strong&gt; (&lt;a
  href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=22060"&gt;22060&lt;/a&gt;)&lt;br&gt;Wednesday, 08:30 AM, Hilton San Francisco - Grand Ballroom B&lt;/li&gt;

&lt;/ul&gt;


&lt;p&gt;

Also keep an eye out for the various NetBeans IDE sessions and demo booth.&lt;/p&gt;
&lt;h3&gt;Linux&lt;/h3&gt;

&lt;p&gt;Check out the four pages of &lt;a
href="http://www.oracle.com/openworld/oow11-focuson-linux-483706.pdf"
&gt;Focus on Linux&lt;/a&gt; sessions and events.&lt;/p&gt;

&lt;h3&gt;MySQL&lt;/h3&gt;
&lt;p&gt;There is a veritable plethora of MySQL content - four pages of
sessions and activites are listed in the &lt;a href="
http://www.oracle.com/openworld/oow11-focuson-mysql-486114.pdf"&gt;Oracle
Focus on MySQL&lt;/a&gt;.  Don't forget the &lt;strong&gt;MySQL Community Reception&lt;/strong&gt;
Tuesday 7:00pm - 9:00pm in the Marriott Marquis - Foothill G.&lt;/p&gt;

&lt;/p&gt;

&lt;p&gt;Having started this post with a shout out, let me end with one to
Bill Karwin, who was instrumental in getting PHP's Zend Framework off
the ground.  He is talking about &lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=29101"&gt;MaatKit&lt;/a&gt;
and &lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=29081"&gt;SQL
Injection&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Update: Ligaya Turmelle, well known in the PHP community, confirmed overnight that despite a recent job move she is still on track to present her  &lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=16040"&gt;MySQL Performance Tuning&lt;/a&gt; talk (16040).&lt;/p&gt;


&lt;p&gt;You can search the OOW session catalog &lt;a
href="https://oracleus.wingateweb.com/scheduler/eventcatalog/eventCatalog.do"
&gt;here&lt;/a&gt; and the JavaOne session catalog &lt;a href="https://oracleus.wingateweb.com/scheduler/eventcatalog/eventCatalogJavaOne.do" &gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/ziyua5EiiaQ" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/scripting_language_related_sessions_at</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_11_2_xe_with</guid>
    <title>Oracle 11.2 XE with newly updated PHP Developer's Guide is available</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/4Q1HUK8DslU/oracle_11_2_xe_with</link>
        <pubDate>Sat, 3 Sep 2011 21:01:10 -0500</pubDate>
    <category>General</category>
    <category>database</category>
    <category>php</category>
    <category>release</category>
    <category>xe</category>
            <description>&lt;p&gt;Oracle Database 11g Release 2 Express Edition aka "Oracle XE" &lt;a
href="http://www.oracle.com/technetwork/database/express-edition/overview/index.html"&gt;is
now available&lt;/a&gt; on Linux 64 bit and Windows 32 bit.  This is a free
version of the Oracle Database. Windows 64 bit is "&lt;a
href="http://twitter.com/#!/krisrice/status/109780254956064768" &gt;in
the works&lt;/a&gt;" but Linux 32 bit is not planned.&lt;/p&gt;

&lt;p&gt;Check out the newly updated &lt;a
href="http://download.oracle.com/docs/cd/E17781_01/appdev.112/e18555/toc.htm"&gt;Oracle
Database Express Edition 2 Day + PHP Developer's Guide&lt;/a&gt;. As well as
HTML and PDF variants, the manual is available in &lt;a
href="http://download.oracle.com/docs/cd/E17781_01/appdev.112/E18555-03.mobi"
&gt;Mobi&lt;/a&gt; and &lt;a
href="http://download.oracle.com/docs/cd/E17781_01/appdev.112/E18555-03.epub"
&gt;EPUB&lt;/a&gt; formats.&lt;/p&gt;

&lt;p&gt;The 2 Day + PHP manual has steps for installing PHP and walks through creating an introductory
application.  It shows different ways to interact with Oracle XE and
introduces PHP 5.3 features.&lt;/p&gt;

&lt;p&gt;The example shows the mechanics of DB interaction.  It builds the application from the ground up so you can understand how to construct your own high performance applications.  If you want to
continue the learning path and use a PHP framework, Oracle 11g XE works with the &lt;a
href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/oow10/php_webapp/php_webapp.htm"
&gt;Developing a PHP Web Application with Oracle Database 11g&lt;/a&gt;
training.&lt;/p&gt;

&lt;p&gt;The Oracle 11.2 XE Linux install is RPM based. It takes just a few
minutes to install, prompting only for a few necessary details such as
desired passwords and ports.  You need root access to install it.&lt;/p&gt;

&lt;p&gt;Oracle 11.2 XE supports &lt;a
href="http://www.oracle.com/technetwork/topics/php/whatsnew/php-scalability-ha-twp-128842.pdf"
&gt;DRCP connection pooling&lt;/a&gt; so you'll really be able to maximize the
small footprint database for PHP applications.&lt;/p&gt;

&lt;p&gt;Readers who want to dive deeper into detail about PHP and advanced
features available in other editions of Oracle Database might be
interested in the later sections of the &lt;a
href="http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html"&gt;Underground
PHP and Oracle Manual&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/4Q1HUK8DslU" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_11_2_xe_with</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_5_3_8_rpms</guid>
    <title>PHP 5.3.8 RPMs are on oss.oracle.com</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/URoo4QhA6QQ/php_5_3_8_rpms</link>
        <pubDate>Tue, 30 Aug 2011 15:41:09 -0500</pubDate>
    <category>General</category>
            <description>&lt;p&gt;I've built PHP 5.3.8 RPM packages with various common extensions
(and the latest OCI8 1.4.6) for Linux x64.  They are downloadable at
&lt;a
href="http://oss.oracle.com/projects/php/"&gt;oss.oracle.com/projects/php/&lt;/a&gt;.
These binaries might be useful for quick testing. They are
unsupported.&lt;/p&gt;

&lt;p&gt;Oracle customers with support using Oracle Linux 5.6+ may prefer
the stable PHP 5.3.3 php53-* packages available on &lt;a
href="https://linux.oracle.com" &gt;ULN&lt;/a&gt;. The OCI8 extension is also
available there.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/URoo4QhA6QQ" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_5_3_8_rpms</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_oci8_1_4_6</guid>
    <title>PHP OCI8 1.4.6 is Available</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/GXSrKrwI4hU/php_oci8_1_4_6</link>
        <pubDate>Mon, 22 Aug 2011 19:15:45 -0500</pubDate>
    <category>General</category>
            <description>I just released &lt;a href="http://pecl.php.net/package/oci8"&gt;PHP OCI8
1.4.6 on PECL&lt;/a&gt;.  This is the same OCI8 extension that is included
in PHP 5.3.7 and PHP 5.3.8.&lt;p&gt;

The release is mostly test suite additions.  A new &lt;a
href="http://php.net/manual/en/function.oci-client-version.php"&gt;oci_client_version()&lt;/a&gt;
function is available.  This is useful for OCI8's test suite to
overcome some of the limitations of PHP's simple test
infrastructure. You might also find it useful in special cases where
you need to know the exact version of the Oracle client libraries that
PHP is using.&lt;p&gt;

There are also some small internal code changes brought on by general
PHP code cleanups.  These OCI8 changes allow cross version portability
for the extension.&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/GXSrKrwI4hU" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_oci8_1_4_6</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_enhanced_adapter_1_4</guid>
    <title>Oracle Enhanced Adapter 1.4.0 for Ruby on Rails is Available</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/19CLiAKBfUs/oracle_enhanced_adapter_1_4</link>
        <pubDate>Wed, 10 Aug 2011 08:45:59 -0500</pubDate>
    <category>ruby</category>
            <description>Check out Raimond Simanovskis's updated Rails ActiveRecord adapter for
Ruby and JRuby with Oracle DB: &lt;a
href="http://blog.rayapps.com/2011/08/09/oracle-enhanced-adapter-1-4-0-and-readme-driven-development/"
&gt;Oracle enhanced adapter 1.4.0 and Readme Driven Development&lt;/a&gt;.  I love the "Readme Driven Development" approach.  It's close to my favorite model which is "install Driven Development".&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/19CLiAKBfUs" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_enhanced_adapter_1_4</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_resources_for_php</guid>
    <title>Oracle Resources for PHP</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/cTDdrbpPtaM/oracle_resources_for_php</link>
        <pubDate>Wed, 15 Jun 2011 11:58:56 -0500</pubDate>
    <category>php</category>
    <category>application</category>
    <category>bdb</category>
    <category>berkeley</category>
    <category>cache</category>
    <category>database</category>
    <category>db</category>
    <category>ide</category>
    <category>linux</category>
    <category>mysql</category>
    <category>netbeans</category>
    <category>oracle</category>
    <category>otn</category>
    <category>php</category>
    <category>server</category>
    <category>timesten</category>
    <category>tuxedo</category>
    <category>virtualization</category>
            <description>&lt;p&gt;Here are some key resources for working with &lt;a class="highlight"
href="http://php.net/"&gt;PHP&lt;/a&gt; and Oracle technologies.&lt;/p&gt;

&lt;ul&gt;
&lt;p&gt;&lt;li&gt;&lt;b&gt;Overall Links&lt;/b&gt;&lt;/p&gt;


&lt;p&gt;&lt;b&gt;Oracle :&lt;/b&gt;  &lt;a class="highlight" href="http://www.oracle.com/technetwork/index.html" &gt;Oracle Technology Network (OTN)&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Homepage : &lt;/b&gt; &lt;a class="highlight" href="http://otn.oracle.com/php"&gt;The PHP Developer Center&lt;/a&gt;  -- downloads, how-tos, sample code and discussion forums brought to you by OTN.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Read : &lt;/b&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/articles/dsl/index.html" &gt;PHP Articles&lt;/a&gt;  -- a collection of informative articles on OTN.&lt;/p&gt;
	    
&lt;p&gt;&lt;b&gt;Technology : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technology/software/index.html"&gt;Download&lt;/a&gt;  the newest versions of other software in Oracle's Technology Stack. &lt;a href="http://www.oracle.com/technetwork/topics/dotnet/whatsnew/application-development-11g-whitepa-132847.pdf" &gt;Read&lt;/a&gt;  about other Oracle application development tools.&lt;/p&gt;


&lt;li&gt;
&lt;a name="php"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;PHP Oracle Database Extension : &lt;/b&gt;&lt;a class="highlight" href="http://pecl.php.net/package/oci8"&gt;OCI8&lt;/a&gt;  is the most available
and scalable PHP adapter for the Oracle database. It is included with PHP, and is also separately downloadable for upgrading older PHP
releases. OCI8 works with PHP 4 and PHP 5, and will compile with Oracle 9&lt;i&gt;i&lt;/i&gt;R2, 10&lt;i&gt;g&lt;/i&gt; and 11&lt;i&gt;g&lt;/i&gt; client libraries. Oracle's standard
cross-version compatibility and connectivity is applicable, so OCI8 can connect to older or newer databases, locally or
remotely.  The latest OCI8 release includes support for Oracle Database 11&lt;i&gt;g&lt;/i&gt; Database Resident Connection Pooling (DRCP), and for Fast
Application Notification (FAN) [&lt;a class="highlight" href="http://www.oracle.com/technetwork/topics/php/php-scalability-ha-twp-128842.pdf"&gt;whitepaper
here&lt;/a&gt;], and also has support for Oracle's authentication and end-to-end tracing meta data attributes [&lt;a class="highlight"
href="http://www.oracle.com/technetwork/articles/dsl/php-web-auditing-171451.html"&gt;article here&lt;/a&gt;].  These
features improve scalability and availabilty of the OCI8 extension.&lt;/p&gt;

&lt;p&gt;The OCI8 extension can also be used with the &lt;a class="highlight" href="http://www.oracle.com/technetwork/database/options/imdb-cache/index.html" &gt;Oracle In-Memory Database Cache&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Book : &lt;a class="highlight"
href="http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html"&gt;The Underground PHP &amp;amp; Oracle
Manual&lt;/a&gt; -- the definitive, free guide to using PHP with Oracle Database.&lt;/p&gt;

&lt;p&gt;Tutorial : &lt;a class="highlight"
href="https://apex.oracle.com/pls/apex/f?p=44785:24:7125334043146::NO:24:P24_CONTENT_ID,P24_PREV_PAGE:5125,29"&gt;Oracle &amp;amp; PHP tutorials&lt;/a&gt;  -- step by
step &lt;a class="highlight" href="http://www.oracle.com/technetwork/tutorials/index.html" &gt;Oracle Learning Library&lt;/a&gt;  tutorials for using PHP with Oracle. (Free OTN &lt;a class="highlight" href="https://myprofile.oracle.com/EndUser/faces/profile/createUser.jspx"&gt;login&lt;/a&gt;  required) &lt;/p&gt;


&lt;p&gt;Read : &lt;a class="highlight" href="http://www.oracle.com/technetwork/topics/php/php-scalability-ha-twp-128842.pdf"&gt;PHP &amp;amp; High Scalability&lt;/a&gt;  --
covers enabling DRCP and FAN for PHP applications.&lt;/p&gt;

&lt;p&gt;Read : &lt;a class="highlight" href="http://www.oracle.com/technetwork/articles/dsl/php-web-auditing-171451.html" &gt;PHP Web Auditing, Authorization and
Monitoring with Oracle Database&lt;/a&gt;  -- learn how to audit individual web users, automatically apply rules to
individual web users to restrict data access, and monitor and trace database usage per application user.&lt;/p&gt;

&lt;p&gt;Forum : &lt;a class="highlight" href="http://forums.oracle.com/forums/forum.jspa?forumID=178"&gt;The Oracle
&amp;amp; PHP forum&lt;/a&gt;  -- technical discussion forum for using PHP with Oracle.&lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="https://blogs.oracle.com/opal/"&gt;PHP and Oracle: Christopher Jones&lt;/a&gt;  -- The latest news on PHP and Oracle.&lt;/p&gt;


&lt;li&gt;
&lt;a name="xe"&gt;&lt;/a&gt;

&lt;p&gt; &lt;b&gt;Database : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/database/express-edition/overview/index.html"&gt;Oracle Express Edition Database&lt;/a&gt;
 -- an entry-level, small-footprint database based on the standard Oracle
Database code base that's &lt;b&gt;free to develop, deploy, and distribute; fast to download; and simple to administer.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;PHP OCI8 works with Oracle Database XE the same way it works with the other editions of Oracle Database.&lt;/p&gt;

&lt;p&gt;Oracle Database XE is a great starter database for:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt; &lt;strong&gt;Developers&lt;/strong&gt; working on PHP, Python, Ruby, Java, .Net and other open source applications.  &lt;/li&gt;

&lt;li&gt; &lt;strong&gt;DBAs&lt;/strong&gt; who need a free, starter database for training and deployment &lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Independent Software Vendors (ISVs) and hardware vendors&lt;/strong&gt; who want a starter database to distribute free of
charge &lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Educational institutions and students&lt;/strong&gt; who need a free database for their curriculum &lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/database/express-edition/downloads/index.html"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="mysql"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Database : &lt;/b&gt;&lt;a class="highlight" href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;  -- The world's most popular open source
database. MySQL Community Edition is the freely downloadable version. Commercial customers have the flexibility of choosing from multiple editions to
meet specific business and technical requirements. Also available for free is the MySQL Workbench for SQL Authoring, System Administration, and schema
modeling.&lt;/p&gt;

&lt;p&gt;Recent additions to MySQL include semi synchronous replication, direct memcached-to-InnoDB access, multi-threaded replication, and enhanced
partitioning.  See &lt;a class="highlight" href="http://dev.mysql.com/tech-resources/articles/whats-new-in-mysql-5.6.html" &gt;What's new in MySQL 5.6&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;PHP's mysqli or PDO_mysql extensions can be used to access MySQL.&lt;/p&gt;

&lt;p&gt;Check out the new &lt;a class="highlight" href="http://pecl.php.net/mysqlnd_qc"
&gt;Query Cache plugin&lt;/a&gt; documented &lt;a class="highlight" href="http://php.net/mysqlnd_qc"
&gt;here&lt;/a&gt; and the &lt;a class="highlight" href="http://pecl.php.net/mysqlnd_ms"
&gt;Replication and Load-Balancing plugin&lt;/a&gt; for master-slave-splitting, documented
[&lt;a class="highlight" href="http://php.net/mysqlnd_ms" &gt;here&lt;/a&gt;].&lt;/p&gt;

&lt;p&gt;Homepage : &lt;a class="highlight" href="http://dev.mysql.com/usingmysql/php/" &gt;Using MySQL With PHP&lt;/a&gt;  -- Articles and downloads&lt;/p&gt;

&lt;p&gt;Forum : &lt;a class="highlight" href="http://forums.mysql.com/list.php?52" &gt;PHP and MySQL forum&lt;/a&gt;  -- The place to ask questions&lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="http://planet.mysql.com/" &gt;Planet MySQL&lt;/a&gt;  -- The latest MySQL news from the community&lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="http://schlueters.de/blog/" &gt;Johannes Schlüter&lt;/a&gt;  -- A member of the MySQL connector team and the current PHP Release Master.&lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="http://www.khankennels.com/blog/" &gt;Me Talking Out Loud&lt;/a&gt;  -- Ligaya Turmelle, a
member of MySQL Support. (and contributer to &lt;a class="highlight" href="http://www.amazon.com/PHP-Anthology-Essential-Tricks-Hacks/dp/0975841998"&gt;The
PHP Anthology: 101 Essential Tips, Tricks &amp; Hacks&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="http://blog.ulf-wendel.de/?p=308" &gt;Internet Super Hero&lt;/a&gt;  -- Ulf Wendel, a member of the MySQL connector team.&lt;/p&gt;

&lt;p&gt;Books : Many!  Including &lt;a class="highlight" href="http://www.amazon.com/PHP-MySQL-Web-Development-4th/dp/0672329166/" &gt;PHP and MySQL Web Development&lt;/a&gt; and &lt;a class="highlight" href="http://www.amazon.com/Web-Database-Applications-PHP-MySQL/dp/0596000413" &gt;Web Database
Applications with PHP &amp; MySQL&lt;/a&gt;  and &lt;a class="highlight"
href="http://www.amazon.com/Learning-MySQL-Step-Step-Database-Driven/dp/0596514018/ref=pd_sim_b_2" &gt;Learning PHP &amp; MySQL: Step-by-Step Guide to
Creating Database-Driven Web Sites&lt;/a&gt; &lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.mysql.com/downloads/"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="bdb"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Database : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html"&gt;Oracle
Berkeley DB 11&lt;i&gt;g&lt;/i&gt;&lt;/a&gt;  -- provides the complex data management features found in
enterprise class databases. These facilities include high throughput, low-latency reads, non-blocking writes, high concurrency, data
scalability, in-memory caching, ACID transactions, automatic and catastrophic recovery when the application, system or hardware fails,
high availability and replication in an application configurable package. Simply configure the library and use the particular features
available to satisfy your particular application needs. Berkeley DB can be configured to address any application need from the hand-held
device to the datacenter, from a local storage solution to a world-wide distributed one, from kilobytes to petabytes. &lt;/p&gt;

&lt;p&gt;Berkeley DB's &lt;a
href="http://www.oracle.com/technetwork/database/berkeleydb/overview/sql-160887.html"
&gt;SQL API&lt;/a&gt; allows PHP's sqlite3 and PDO_sqlite extensions to be
used.&lt;/p&gt;
  
&lt;p&gt;Berkeley DB also includes source code for a php_db4 extension.&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html"&gt;Install Now!&lt;/a&gt; &lt;/p&gt; 


&lt;li&gt;
&lt;a name="netbeans"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;IDE : &lt;/b&gt;&lt;a class="highlight" href="http://netbeans.org/"&gt;NetBeans&lt;/a&gt;  --  lets you develop desktop, mobile and web
applications using Java, PHP, C/C++ and more.  Runs on Windows, Linux, Mac OS X and Solaris. NetBeans IDE is open-source and free.&lt;/p&gt;

&lt;p&gt;Understand: &lt;a class="highlight" href="http://netbeans.org/features/php/" &gt;NetBeans PHP features&lt;/a&gt;  -- All the great features that NetBeans has for PHP developers&lt;/p&gt;

&lt;p&gt;Learn: &lt;a class="highlight" href="http://netbeans.org/kb/trails/php.html" &gt;NetBeans PHP Learning Trail&lt;/a&gt;  -- the best way to learn how to use NetBeans&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://netbeans.org/downloads/"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="vbox"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Virtualize : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/server-storage/virtualbox/overview/index.html"&gt;Oracle VM
VirtualBox&lt;/a&gt;  -- powerful Cross-platform Virtualization Software for x86-based systems.  "Cross-platform"
means that it installs on Windows, Linux, Mac OS X and Solaris x86 computers. And "Virtualization Software" means that you can create
and run multiple Virtual Machines, running different operating systems, on the same computer at the same time. For example, you can
run Windows and Linux on your Mac, run Linux and Solaris on your Windows PC, or run Windows on your Linux systems.  &lt;/p&gt;


&lt;p&gt; Oracle VM VirtualBox is available as Open Source or pre-built Binaries for Windows, Linux, Mac OS X and
Solaris.  &lt;/p&gt;

&lt;p&gt;OTN hosts some &lt;a class="highlight" href="http://www.oracle.com/technetwork/community/developer-vm/index.html" &gt;pre-built Developer VMs&lt;/a&gt; , including an Oracle Tuxedo Web Application Server VM showing PHP support.  There is also a Zend Server VM for PHP created by Zend.  &lt;a class="highlight"
href="http://www.oracle.com/technetwork/topics/php/zend-server-096314.html"&gt;Zend Server&lt;/a&gt;  is a complete,
Oracle-enabled, enterprise-ready Web Application Server for running and managing PHP applications that require a high level of reliability,
performance and security.  Zend Server is available in community and supported editions.&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.virtualbox.org/wiki/Downloads"&gt; Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="linux"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Operating system : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/us/technologies/linux/index.html"&gt;Oracle Linux&lt;/a&gt;  -- free to download and distribute.  As one of the most widely deployed operating systems today, Linux is increasingly being
adopted for cloud-based solutions. Oracle Linux is the most complete and integrated solution available and delivers higher performance and better
reliability at up to 7 times lower cost than Red Hat. &lt;a class="highlight" href="http://www.oracle.com/us/technologies/linux/competitive-335546.html" &gt;Why Choose Oracle
Linux over Red Hat Linux?&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Oracle Linux 5.6 and 6 introduced PHP 5.3 packages.  Subscribers to the Unbreakable Linux Network have access to an additional
pre-built PHP OCI8 RPM, and also direct access to an RPM for installing  &lt;a class="highlight"
href="http://www.oracle.com/technetwork/topics/php/zend-server-096314.html"&gt;Zend Server&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;Users of older Linux 5 releases can get PHP 5.3 RPMs from &lt;a class="highlight" href="http://oss.oracle.com/projects/php/"&gt;oss.oracle.com&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="https://linux.oracle.com"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="tuxedo"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Application Server : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/middleware/tuxedo/overview/index.html"&gt;Oracle Tuxedo&lt;/a&gt;
 -- provides a robust, grid enabled platform for developing enterprise applications.  It provides mainframe-class scale
and performance on open, distributed systems for software written in C, C++, COBOL, PHP, Python and Ruby.  Oracle Tuxedo provides cost-effective
reliability, extreme scalability and throughput of hundreds of thousands of transactions per second.  Functionality like Web services, SCA programming
model, metadata driven application development make it simple to develop and integrate applications written in many programming languages.  &lt;/p&gt;

&lt;p&gt;PHP applications can be hosted on the Tuxedo platform without requiring any code changes and can leverage high availability, scalability and
integration capabilities.&lt;/p&gt;

&lt;p&gt;The whitepaper &lt;a href="http://www.oracle.com/technetwork/middleware/tuxedo/tuxedo-dynamic-langs-twp-401471.pdf"&gt;Oracle Tuxedo - An Enterprise
Platform for Dynamic Languages&lt;/a&gt; explains the architecture and features.  A &lt;a
href="http://www.oracle.com/technetwork/middleware/tuxedo/downloads/index.html"&gt;Tuxedo Demo VM&lt;/a&gt; for VirtualBox is available for immediate
testing.&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/middleware/tuxedo/downloads/index.html"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;

&lt;li&gt;
&lt;a name="ic"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Client Libraries : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/database/features/instant-client/index-100365.html"&gt;Oracle Instant
Client&lt;/a&gt;  -- a small footprint set of libraries that allows applications and tools to connect to an existing Oracle
Database.  Oracle OCI, OCCI, Pro*C, ODBC, and JDBC applications work without modification.&lt;/p&gt;

&lt;p&gt;The PHP OCI8 extension can be built with Oracle Instant Client to connect to a remote database.&lt;/p&gt;

&lt;p&gt;Instant Client is provided under a separate OTN Development and Distribution License for Instant Client that
allows most licensees to download, redistribute, and deploy in production environments, without charge. &lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/cTDdrbpPtaM" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_resources_for_php</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/mid_conference_wrap_up</guid>
    <title>Mid conference wrap up</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/2d14SqJ4SwI/mid_conference_wrap_up</link>
        <pubDate>Tue, 24 May 2011 12:51:10 -0500</pubDate>
    <category>php</category>
    <category>conference</category>
    <category>dpc11</category>
    <category>php</category>
    <category>tek11</category>
            <description>&lt;p&gt;In a nicer section of the RAI conference center than in previous
years I've attended, the Dutch PHP conference last week was as professionally
organized as ever by &lt;a href="http://www.ibuildings.nl/"&gt;ibuildings&lt;/a&gt;.  The weather was kind too, having cleared up from a
previous blustery days I'd spent south of Amsterdam with my
parents.&lt;/p&gt;

&lt;p&gt;My talk had a big audience, which stayed the course.  Unfortunately
my abstract was condensed down in the small printed
name-tag/program-guide, which contributed to some polarized reviews.
Some really liked the Oracle-PHP overview section, while others were
not expecting it.&lt;/p&gt;

&lt;p&gt;In a few minutes I'm heading off to Chicago for &lt;a
href="http://tek11.phparch.com/" &gt;php|tek&lt;/a&gt;.  My &lt;a
href="http://tek11.phparch.com/talk-synopses/#Developing-and-Deploying-High-Performance-PHP-Applications"
&gt;talk&lt;/a&gt; is based on the presentation I gave at DPC but I'll cut down
the "state of the Oracle-PHP nation" section down by a couple of
slides (taking it to about 8 minutes worth).  I'll also rejig which
advanced Oracle techniques are covered in the main part of the talk.
My code snippets and screen captures didn't satisfy DPC audience's
thirst for knowledge so I'm adding back (some) live demos - hey, why
not live dangerously!?&lt;/p&gt;

&lt;p&gt;Since I'm at the conference for the full three session days,
there'll be plenty of time for you to pin me down with your questions.
And if you have MySQL questions, Ligaya Turmelle is the person to talk
to.  Her tutorial is in session as I write.  She's also talking about
schema normalization on Wednesday afternoon.&lt;/p&gt;

&lt;p&gt;At php|tek make sure you come along to the Uncon after hours on
Wednesday and find all the latest and hot topics.  Oracle is
sponsoring it this year.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/2d14SqJ4SwI" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/mid_conference_wrap_up</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_at_dutch_php_conference</guid>
    <title>Oracle at the Dutch PHP Conference &amp; php|tek</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/TqObBVVQH9c/oracle_at_dutch_php_conference</link>
        <pubDate>Sat, 14 May 2011 11:15:08 -0500</pubDate>
    <category>php</category>
    <category>conference</category>
    <category>oracle</category>
    <category>php</category>
            <description>&lt;p&gt;I'm off to Amsterdam to talk at the &lt;a href="http://www.phpconference.nl/"&gt;Dutch PHP Conference&lt;/a&gt;.  After that it's on to Chicago for &lt;a href="http://tek11.phparch.com/"&gt;php|tek&lt;/a&gt;. &lt;/p&gt; 

&lt;p&gt;See you there!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/TqObBVVQH9c" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_at_dutch_php_conference</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_tuxedo_a_new_way</guid>
    <title>Oracle Tuxedo: A New way to Run PHP Applications</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/WZUSbdYrzww/oracle_tuxedo_a_new_way</link>
        <pubDate>Thu, 12 May 2011 16:08:57 -0500</pubDate>
    <category>php</category>
    <category>application</category>
    <category>availability</category>
    <category>php</category>
    <category>scalability</category>
    <category>server</category>
    <category>tuxedo</category>
            <description>&lt;p&gt;The Oracle Tuxedo team have posted an Oracle Tuxedo 11.1.1.2 Web
Application Server Demo for PHP.  It is a VirtualBox VM so you can
immediately test it out.  The free VM is available from OTN's &lt;a
href="http://www.oracle.com/technetwork/community/developer-vm/index.html"
&gt;Pre-Built Developer VMs&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;Oracle Tuxedo provides a scalable and highly available mid tier
platform capable of managing and integrating heterogeneous
applications.  &lt;a
href="http://www.oracle.com/technetwork/middleware/tuxedo/overview/tuxedo-datasheet-130066.pdf"
&gt;This overview datasheet&lt;/a&gt; explains its capabilities: "&lt;i&gt;Oracle
Tuxedo provides a service-oriented infrastructure for efficiently
routing, dispatching, and managing requests, events, and application
queues across system processes and application services&lt;/i&gt;".  A raft
of other material is on the Tuxedo &lt;a
href="http://www.oracle.com/technetwork/middleware/tuxedo/overview/index.html"
&gt;landing page&lt;/a&gt;.  There is also a new white paper on PHP being
reviewed at this very moment.&lt;/p&gt;

&lt;p&gt;The VM uses Oracle Linux 5.6.  It has PHP 5.3 and Oracle Tuxedo
11.1.1.2 installed and configured.  The SALT and TSAM components of
Tuxedo are also available.  &lt;/p&gt;

&lt;p&gt;Tuxedo's PHP support comes in the form of a new mod_tuxedo module
for Apache 2.2 (or Oracle HTTP Server).  This handles all PHP scripts,
executing them using managed PHP processes.  Existing applications can
run normally:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://blogs.oracle.com/opal/resource/images/tux_php_app.png"&gt;&lt;/p&gt;

&lt;p&gt;Tuxedo also lets PHP be exposed as a web service:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://blogs.oracle.com/opal/resource/images/tux_php_soa.png"&gt;&lt;/p&gt;

&lt;p&gt;The tutorial manual provided inside the VM steps through using PHP
in both ways.  The NetBeans IDE, Oracle Database XE and MySQL are
included on the VM to make it easier to carry out your own further
experiments with Tuxedo and PHP.&lt;/p&gt;

&lt;p&gt;Tuxedo has been around for a long time and has an established
customer base.  If you look at Oracle Database's big TPC-C benchmark's
you can see Tuxedo was involved.  It's even &lt;a
href="https://blogs.oracle.com/Tuxedo/entry/tuxedo_is_certified_on_exalogi"
&gt;certified on Exalogic&lt;/a&gt;. The new dynamic language support in Tuxedo
is going to open up "Enterprise" infrastructure, making it easy to
integrate modern solutions in a heterogeneous environment. &lt;/p&gt;

&lt;p&gt;When I get back from the Dutch PHP and PHP|Tek conferences, which
run back to back from next week, I plan to write up more details about
using Tuxedo and PHP.&lt;/p&gt;

&lt;p&gt;Update: a new whitepaper is available: &lt;a href="http://www.oracle.com/technetwork/middleware/tuxedo/tuxedo-dynamic-langs-twp-401471.pdf"&gt;
Oracle Tuxedo: An Enterprise Platform for
Dynamic Languages&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/WZUSbdYrzww" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_tuxedo_a_new_way</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_5_4_is_gathering</guid>
    <title>PHP 5.4 is Gathering Momentum</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/H-UUF400DE0/php_5_4_is_gathering</link>
        <pubDate>Wed, 11 May 2011 16:36:24 -0500</pubDate>
    <category>php</category>
    <category>community</category>
    <category>development</category>
    <category>karma</category>
    <category>php</category>
    <category>release</category>
    <category>svn</category>
    <category>test</category>
            <description>&lt;p&gt;Discussion on the PHP mail lists and IRC channels in the past few
days has been looking positive about an alpha release of PHP 5.4
soon.  This will be taken from the "trunk" branch of PHP.  The exact
feature list is under discussion but the mood seems to be
"ship what we currently have" though a couple of features are
slated to be deferred until later.&lt;/p&gt;

&lt;p&gt;A &lt;a href="http://news.php.net/php.internals/52328" &gt;paragraph from a post by
Rasmus Lerdorf&lt;/a&gt; on PHP's "internals" mail list is worth re-broadcasting.  
Rasmus is more than willing to grant PHP karma to encourage contributions:&lt;/p&gt;

&lt;i&gt;&lt;blockquote&gt;And if you can't figure out how to fix a test, post the
details here.  I'd love to point some of the obvious talents and
energy of this list towards the code. If you don't have an svn account
for committing your fixed test, go to &lt;a
href="http://www.php.net/svn-php.php"
&gt;http://www.php.net/svn-php.php&lt;/a&gt; and fill in the little form at the
bottom there and put in the test that you fixed and a 1-liner about
how you fixed it and I will set you up with an account right
away. Info on how to check out the code from svn is here: &lt;a
href="https://wiki.php.net/vcs/svnfaq"
&gt;https://wiki.php.net/vcs/svnfaq&lt;/a&gt; &lt;/blockquote&gt;&lt;/i&gt;

&lt;p&gt;So, you can easily become a contributor to PHP, which would look great
on your resume.&lt;/p&gt;

&lt;p&gt;If SVN seems daunting you can run PHP tests from the normal &lt;a
href="http://snaps.php.net/" &gt;snapshots&lt;/a&gt; and &lt;a
href="http://php.net/downloads.php" &gt;release bundles&lt;/a&gt; too.&lt;/p&gt;

&lt;p&gt;To discuss test issues you can subscribe to the PHP internals and
QA mail lists at &lt;a href="http://php.net/mailing-lists.php"
&gt;http://php.net/mailing-lists.php&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/H-UUF400DE0" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_5_4_is_gathering</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/configuring_php_gd_on_ubuntu</guid>
    <title>Configuring PHP GD on Ubuntu 11.04 "Natty"</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/SWcFqDU7UuQ/configuring_php_gd_on_ubuntu</link>
        <pubDate>Wed, 11 May 2011 14:52:27 -0500</pubDate>
    <category>php</category>
    <category>compile</category>
    <category>library</category>
    <category>linux</category>
    <category>path</category>
    <category>php</category>
            <description>&lt;p&gt;This is a post for the "so I can find it again" category.  (It is also a test for the new blogging infrastructure that Oracle migrated to last week).&lt;/p&gt;

&lt;p&gt;After an upgrade to Ubuntu 11.04 on one 32 bit machine, my simple custom script to build PHP 5.3 from source failed.  The script isn't complex, pulling in a couple of extensions that I use for sanity checking the OCI8 extension.  I use the GD extension to generate some simple graphs.&lt;/p&gt;

&lt;p&gt;My configuration command was like:&lt;/p&gt;

&lt;pre&gt;./configure ... --with-gd --with-jpeg-dir --with-png-dir ...&lt;/pre&gt;

&lt;p&gt;which gave the error:&lt;/p&gt;

&lt;pre&gt;configure: error: libjpeg.(a|so) not found&lt;/pre&gt;

&lt;p&gt;This release of Ubuntu has moved around some standard libraries.  After some fiddling around, checking the 'configure' options and the GD extension config.m4 file intention, the solution for me was simple.  Add the &lt;code&gt;--with-libdir=lib/i386-linux-gnu&lt;/code&gt; option to configure.  I haven't tried this with other extensions so YMMV.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; Rasmus just merged a &lt;a href="http://svn.php.net/viewvc?view=revision&amp;revision=310964"&gt;patch&lt;/a&gt; to gd that should make the &lt;code&gt;--with-libdir&lt;/code&gt; option unnecessary&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/SWcFqDU7UuQ" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/configuring_php_gd_on_ubuntu</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/malicious_website_use_will_nev</guid>
    <title>Malicious website use will never go away: how do you manage it?</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/4O_Edg5FuBM/malicious_website_use_will_nev</link>
        <pubDate>Wed, 27 Apr 2011 14:48:43 -0500</pubDate>
    <category>php</category>
    <category>comment</category>
    <category>experience</category>
    <category>forum</category>
    <category>hacking</category>
    <category>manipluation</category>
    <category>mysql</category>
    <category>php</category>
    <category>quality</category>
    <category>security</category>
    <category>spam</category>
    <category>user</category>
    <category>website</category>
    <atom:summary type="html"> </atom:summary>        <description>&lt;p&gt;&lt;p&gt;OTN has published two articles by Eli White that stem from his long
experience with protecting high volume websites from unwanted and
malicious use.  Eli has worked on many large scale PHP projects
including Digg, TripAdvisor, and for the Hubble space telescope
program.  I've seen Eli's conference presentation on preventing web
site spam and on the deeper topic of website manipulation.  I am
really glad to see the material put in article format.  The techniques
Eli covers will always be applicable in one form or another.  They
should be a fundamental part of any website architect's bag of
tricks.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The articles are:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.oracle.com/technetwork/articles/dsl/combating-spam-360061.html" &gt;Combating Spam for Healthier Websites&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;and&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.oracle.com/technetwork/articles/dsl/preventing-website-manipulation-366493.html" &gt;Preventing Nefarious Website Manipulation (Gaming a System)&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;These articles follow on from Eli's recent two part article on &lt;a
href="http://www.oracle.com/technetwork/articles/dsl/white-php-part1-355135.html"
&gt;Scaling a PHP MySQL Web Application&lt;/a&gt;.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/4O_Edg5FuBM" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/malicious_website_use_will_nev</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/sqlplus_101_substitution_varia</guid>
    <title>SQL*Plus 10.1 Substitution Variables</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/7-tHMJ4ZiqI/sqlplus_101_substitution_varia</link>
        <pubDate>Mon, 11 Apr 2011 10:11:10 -0500</pubDate>
    <category>root</category>
    <category>article</category>
    <category>parameter</category>
    <category>prompt</category>
    <category>reference</category>
    <category>sql*plus</category>
    <category>sqlplus</category>
    <category>substitution</category>
    <category>value</category>
    <category>variable</category>
    <atom:summary type="html"> </atom:summary>        <description>&lt;p&gt;This article from 2004 was on OTN for many years. It wasn't flagged for
saving when they did an infrastructure migration in 2010 but I think
it still has some value because SQL*Plus is fundamentally unchanged.
Ignore the reference manual links, which don't point to the current
manual.  Also ignore the section on &lt;i&gt;i&lt;/i&gt;SQL*Plus, a product
obsoleted by the introduction of Oracle Apex and SQL Developer.&lt;/p&gt;

&lt;hr&gt;
&lt;h2&gt;Contents&lt;/h2&gt;
&lt;dl&gt;
&lt;dd&gt;&lt;a href="#1"&gt;1 Introduction&lt;/a&gt;
&lt;dd&gt;&lt;a href="#2"&gt;2 Using Substitution Variables&lt;/a&gt;
&lt;dl&gt;
&lt;dd&gt;&lt;a href="#2_1"&gt;2.1 Creating, Showing and Deleting Substitution Variables&lt;/a&gt;
&lt;dd&gt;&lt;a href="#2_2"&gt;2.2 Referencing Substitution Variables&lt;/a&gt;
&lt;dd&gt;&lt;a href="#2_3"&gt;2.3 Prompting for Undefined Variables&lt;/a&gt;
&lt;dd&gt;&lt;a href="#2_4"&gt;2.4 Difference Between "&amp;amp;" and "&amp;amp;&amp;amp;" Prefixes&lt;/a&gt;
&lt;dd&gt;&lt;a href="#2_5"&gt;2.5 Storing a Query Column Value in a Substitution Variable&lt;/a&gt;
&lt;dd&gt;&lt;a href="#2_6"&gt;2.6 Predefined Substitution Variables&lt;/a&gt;
&lt;dd&gt;&lt;a href="#2_7"&gt;2.7 Script Parameters&lt;/a&gt;
&lt;dd&gt;&lt;a href="#2_8"&gt;2.8 More on Substitution Variables&lt;/a&gt;
&lt;/dl&gt;
&lt;dd&gt;&lt;a href="#3"&gt;3 Using Bind Variables&lt;/a&gt;
&lt;dl&gt;
&lt;dd&gt;&lt;a href="#3_1"&gt;3.1 Assigning Substitution Variables to Bind Variables&lt;/a&gt;
&lt;dd&gt;&lt;a href="#3_2"&gt;3.2 Assigning Bind Variables to Substitution Variables&lt;/a&gt;
&lt;/dl&gt;
&lt;dd&gt;&lt;a href="#4"&gt;4 Using System Variables&lt;/a&gt;
&lt;dl&gt;
&lt;dd&gt;&lt;a href="#4_1"&gt;4.1 System Variables Influencing Substitution Variables&lt;/a&gt;
  &lt;dl&gt;
    &lt;dd&gt;&lt;a href="#4_1_1"&gt;4.1.1 SET CONCAT&lt;/a&gt;
    &lt;dd&gt;&lt;a href="#4_1_2"&gt;4.1.2 SET DEFINE&lt;/a&gt;
    &lt;dd&gt;&lt;a href="#4_1_3"&gt;4.1.3 SET ESCAPE&lt;/a&gt;
    &lt;dd&gt;&lt;a href="#4_1_4"&gt;4.1.4 SET NULL&lt;/a&gt;
    &lt;dd&gt;&lt;a href="#4_1_5"&gt;4.1.5 SET NUMFORMAT&lt;/a&gt;
    &lt;dd&gt;&lt;a href="#4_1_6"&gt;4.1.6 SET NUMWIDTH&lt;/a&gt;
    &lt;dd&gt;&lt;a href="#4_1_7"&gt;4.1.7 SET SQLPROMPT&lt;/a&gt;
    &lt;dd&gt;&lt;a href="#4_1_8"&gt;4.1.8 SET VERIFY&lt;/a&gt;
&lt;/dl&gt;
&lt;dd&gt;&lt;a href="#4_2"&gt;4.2 System Variables in Titles and EXIT&lt;/a&gt;
&lt;/dl&gt;
&lt;dd&gt;&lt;a href="#5"&gt;5 SQL*Plus Substitution Variable Commands&lt;/a&gt;
&lt;dl&gt;
&lt;dd&gt;&lt;a href="#5_1"&gt;5.1 ACCEPT Command&lt;/a&gt;
&lt;dd&gt;&lt;a href="#5_2"&gt;5.2 COLUMN Command&lt;/a&gt;
&lt;dd&gt;&lt;a href="#5_3"&gt;5.3 DEFINE Command&lt;/a&gt;
&lt;dd&gt;&lt;a href="#5_4"&gt;5.4 EDIT Command&lt;/a&gt;
&lt;dd&gt;&lt;a href="#5_5"&gt;5.5 EXIT Command&lt;/a&gt;
&lt;dd&gt;&lt;a href="#5_6"&gt;5.6 HOST Command&lt;/a&gt;
&lt;dd&gt;&lt;a href="#5_7"&gt;5.7 TTITLE, BTITLE, REPHEADER and REPFOOTER Commands&lt;/a&gt;
&lt;dl&gt;
&lt;dd&gt;&lt;a href="#5_7_1"&gt;5.7.1 Using "&amp;amp;" Prefixes With Title Variables&lt;/a&gt;
&lt;dd&gt;&lt;a href="#5_7_2"&gt;5.7.2 Variables and Text Spacing in Titles&lt;/a&gt;
&lt;/dl&gt;
&lt;dd&gt;&lt;a href="#5_8"&gt;5.8 UNDEFINE Command&lt;/a&gt;
&lt;dd&gt;&lt;a href="#5_9"&gt;5.9 WHENEVER Command&lt;/a&gt;
&lt;/dl&gt;
&lt;dd&gt;&lt;a href="#6"&gt;6 Substitution Variables Namespace, Types, Formats and Limits&lt;/a&gt;
&lt;dl&gt;
&lt;dd&gt;&lt;a href="#6_1"&gt;6.1 Substitution Variable Namespace&lt;/a&gt;
&lt;dd&gt;&lt;a href="#6_2"&gt;6.2 Substitution Variable Types&lt;/a&gt;
&lt;dd&gt;&lt;a href="#6_3"&gt;6.3 Substitution Variable Formats&lt;/a&gt;
&lt;dd&gt;&lt;a href="#6_4"&gt;6.4 Substitution Variable Limits&lt;/a&gt;
&lt;/dl&gt;
&lt;dd&gt;&lt;a href="#7"&gt;7 &lt;i&gt;i&lt;/i&gt;SQL*Plus and Substitution Variables&lt;/a&gt;
&lt;dl&gt;
&lt;dd&gt;&lt;a href="#7_1"&gt;7.1 &lt;i&gt;i&lt;/i&gt;SQL*Plus 9&lt;i&lt;i&lt;/i&gt; and SQL*Plus Substitution Variable Compatibility&lt;/a&gt;
&lt;dd&gt;&lt;a href="#7_2"&gt;7.2 &lt;i&gt;i&lt;/i&gt;SQL*Plus Parameters&lt;/a&gt;
&lt;/dl&gt;
&lt;dd&gt;&lt;a href="#8"&gt;8 Substitution Variable Summary&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9"&gt;9 Substitution Variable Examples&lt;/a&gt;
&lt;dl&gt;
&lt;dd&gt;&lt;a href="#9_1"&gt;9.1 Setting a Substitution Variable's Value&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_2"&gt;9.2 Using a Substitution Variable&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_3"&gt;9.3 Finding All Defined Substitution Variables&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_4"&gt;9.4 Inserting Data Containing "&amp;amp;" Without Being Prompted&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_5"&gt;9.5 Putting the Current Date in a Spool File Name&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_6"&gt;9.6 Appending Alphanumeric Characters Immediately After a Substitution Variable&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_7"&gt;9.7 Putting a Period After a Substitution Variable&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_8"&gt;9.8 Using a Fixed Value Variable in a TTITLE, BTITLE, REPHEADER or REPFOOTER&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_9"&gt;9.9 Using a Changing Value Variable in a TTITLE, BTITLE, REPHEADER or REPFOOTER&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_10"&gt;9.10 Using the Value of a Bind Variable in a SQL*Plus Command Like SPOOL&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_11"&gt;9.11 Passing Parameters to SQL*Plus Substitution Variables&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_12"&gt;9.12 Passing Operating System Variables to SQL*Plus&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_13"&gt;9.13 Passing a Value to a PL/SQL Procedure From the Command Line&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_14"&gt;9.14 Allowing Script Parameters to be Optional and Have a Default Value&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_15"&gt;9.15 Passing a Value to an &lt;i&gt;i&lt;/i&gt;SQL*Plus Dynamic Report for the Web&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_16"&gt;9.16 Customizing Parameter Prompts for an &lt;i&gt;i&lt;/i&gt;SQL*Plus Dynamic Report for the Web&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_17"&gt;9.17 Using a Variable for the SQL*Plus Return Status&lt;/a&gt;
&lt;dd&gt;&lt;a href="#9_18"&gt;9.18 Putting the Username and Database in the Prompt&lt;/a&gt;
&lt;/dl&gt;

&lt;/dl&gt;

&lt;hr&gt;

&lt;a name=1&gt;&lt;/a&gt;
&lt;h2&gt;1 Introduction&lt;/h2&gt;

&lt;p&gt;This document explains how SQL*Plus substitution variables work and where they 
  can be used. It shows the relationship between the three types of variable (substitution, bind, and system) used 

  in SQL*Plus.&lt;/p&gt;
&lt;p&gt;Substitution variables can replace SQL*Plus command options or other hard-coded 
  text. They can be used to customize SQL*Plus script output. Substitution variable 
  references in a statement are pre-processed and replaced before SQL*Plus executes 
  the statement. Variable values can be pre-defined, prompted for, or set to script 

  parameters. Variables can also hold values returned from queries. Sometimes 
  substitution variables are known as &lt;I&gt;user variables&lt;/I&gt; or &lt;I&gt;define variables&lt;/I&gt;.&lt;/p&gt;
&lt;p&gt;Bind variables store data values for SQL and PL/SQL statements executed in 
  the RDBMS. They can hold single values or complete result sets.&lt;/p&gt;
&lt;p&gt;System variables contain values directly controlling SQL*Plus, such as the 
  line size and page size of reports. Some system variables affect how substitution 

  variables are processed. System variables are sometimes called &lt;I&gt;SET variables&lt;/I&gt;.&lt;/p&gt;
&lt;p&gt;This document is a complete reference but you can understand 
  and use substitution variables in a few minutes by reading the overview 
  in &lt;a href="#2"&gt;Section 2&lt;/a&gt; and looking at the examples in the last section.&lt;/p&gt;

&lt;p&gt;&lt;a href="#3"&gt;Section 3&lt;/a&gt; and &lt;a href="#4"&gt;Section 4&lt;/a&gt; discuss 
  bind and system variables respectively, and how they interact with substitution variables.&lt;/p&gt;

&lt;p&gt;&lt;a href="#5"&gt;Section 5&lt;/a&gt; discusses in detail all SQL*Plus commands 
  that interact with substitution variables.&lt;/p&gt;

&lt;p&gt;&lt;a href="#6"&gt;Section 6&lt;/a&gt;
  gives substitution variable limits and some finer points.&lt;/p&gt;

&lt;p&gt;&lt;a href="#7"&gt;Section 7&lt;/a&gt; covers substitution variables in the 
  &lt;I&gt;i&lt;/I&gt;SQL*Plus web based interface.&lt;/p&gt;
&lt;p&gt;&lt;a href="#8"&gt;Section 8&lt;/a&gt; is a brief summary of substitution variables.&lt;/p&gt;
&lt;p&gt;&lt;a href="#9"&gt;Section 9&lt;/a&gt; gives a number examples of using substitution 

  variables.&lt;/p&gt; &lt;p&gt;This document was
updated in February 2004 for SQL*Plus Version 10.1. However all examples
in this document apply to previous versions of SQL*Plus, except where noted.&lt;/p&gt;

&lt;p&gt;Small sections were borrowed from the SQL*Plus User's Guide and
Reference&lt;/a&gt; and the SQL*Plus FAQ.  Some examples were derived from
Support Notes and from questions posted on the &lt;i&gt;i&lt;/i&gt;SQL*Plus Forum.&lt;/p&gt;

&lt;p&gt;Thanks to all reviewers, especially Glenn Stokol, Sharon
Castledine and the SQL*Plus Team.&lt;/p&gt;

&lt;A name=2&gt;&lt;/A&gt;
&lt;h2&gt;2 Using Substitution Variables&lt;/h2&gt;

&lt;h3&gt;&lt;A name=2_1&gt;&lt;/A&gt;2.1 Creating, Showing and Deleting Substitution Variables&lt;/h3&gt;
&lt;p&gt;Substitution variables can be explicitly created with the DEFINE command.    Defining a variable means storing a value for future use:&lt;/p&gt;

&lt;PRE&gt;    SQL&amp;gt; define myv = 'King'
&lt;/PRE&gt;
&lt;p&gt;This creates a variable called "myv" containing the text "King".&lt;/p&gt;
&lt;p&gt;Another way to create substitution variables is with the ACCEPT command. This
  can be used to prompt for a value:&lt;/p&gt;

&lt;PRE&gt;    SQL&amp;gt; accept myv2 char prompt 'Enter a last name: '
&lt;/PRE&gt;
&lt;p&gt;This command causes SQL*Plus to stop and prompt you to enter a character string:&lt;/p&gt;
&lt;PRE&gt;    Enter a last name: _
&lt;/PRE&gt;
&lt;p&gt;What you enter is stored in the variable "myv2".&lt;/p&gt;

&lt;p&gt;The DEFINE command can also be used to display known variables. It shows the
  variable name, value and type. Any variable that DEFINE lists is said to be
  &lt;I&gt;defined&lt;/I&gt;:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define myv
    DEFINE MYV             = "King" (CHAR)
&lt;/PRE&gt;
&lt;p&gt;All variables that are currently defined can be shown by executing the DEFINE

  command with no arguments:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define
    DEFINE MYV             = "King" (CHAR)
    DEFINE MYV2            = "Taylor" (CHAR)
    ...
&lt;/PRE&gt;
&lt;p&gt;Any variable not listed is &lt;I&gt;undefined&lt;/I&gt;:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define abc

    SP2-0135: symbol abc is UNDEFINED
&lt;/PRE&gt;
&lt;p&gt;Substitution variables can be removed with the UNDEFINE command:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; undefine myv
&lt;/PRE&gt;
&lt;h3&gt;&lt;A name=2_2&gt;&lt;/A&gt;2.2 Referencing Substitution Variables&lt;/h3&gt;
&lt;p&gt;Variables can be referenced by prefixing their name with an ampersand (&amp;amp;):&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define myv = 'King'
    SQL&amp;gt; select employee_id from employees where last_name = '&amp;amp;myv';

&lt;/PRE&gt;
&lt;p&gt;SQL*Plus lists the statement line number and line containing the substitution
  variable "myv" before and after substitution:&lt;/p&gt;
&lt;PRE&gt;    old   1: select employee_id from employees where last_name = '&amp;amp;myv'
    new   1: select employee_id from employees where last_name = 'King'
&lt;/PRE&gt;

&lt;p&gt;Lines verifying substitution are displayed for SQL or PL/SQL
  statements. The lines can be hidden with &lt;a href="#4_1_8"&gt;SET VERIFY
  OFF&lt;/a&gt;. Verification never occurs for variables in SQL*Plus
  commands (e.g. SPOOL and SET).&lt;/p&gt;

&lt;p&gt;A more practical use of substitution variables is to prompt for a value before
  referencing the variable:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; accept myv char prompt 'Enter a last name: '
    SQL&amp;gt; select employee_id from employees where last_name = '&amp;amp;myv';
&lt;/PRE&gt;
&lt;p&gt;If these two commands are stored in a SQL*Plus script, a different last name
  can be entered each time the script is run.&lt;/p&gt;
&lt;h3&gt;&lt;A name=2_3&gt;&lt;/A&gt;2.3 Prompting for Undefined Variables&lt;/h3&gt;

&lt;p&gt;If a variable is referenced using an "&amp;amp;" prefix, but the variable value
  is not yet defined, SQL*Plus prompts you for a value:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define myname
    SP2-0135: symbol myname is UNDEFINED

    SQL&amp;gt; select employee_id from employees where last_name = '&amp;amp;myname';
    Enter value for myname:
&lt;/PRE&gt;
&lt;p&gt;After you enter a value, SQL*Plus substitutes the variable and executes the
  query.&lt;/p&gt;
&lt;p&gt;The Oracle Globalization Language setting
  (e.g. the language component of the NLS_LANG environment variable) determines

  the exact language used for the "Enter value for" prompt. The prompt text cannot
  otherwise be changed.&lt;/p&gt;
&lt;h3&gt;&lt;A name=2_4&gt;&lt;/A&gt;2.4 Difference Between "&amp;amp;" and "&amp;amp;&amp;amp;" Prefixes&lt;/h3&gt;
&lt;p&gt;Both single ampersand (&amp;amp;) and double ampersand (&amp;amp;&amp;amp;) can prefix
  a substitution variable name in a statement. SQL*Plus pre-processes the statement
  and substitutes the variable's value. The statement is then executed. If the
  variable was not previously defined then SQL*Plus prompts you for a value before
  doing the substitution.&lt;/p&gt;
&lt;p&gt;If a single ampersand prefix is used with an undefined variable, the value
  you enter at the prompt is not stored. Immediately after the value
  is substituted in the statement the variable is discarded and remains undefined.
  If the variable is referenced twice, even in the same statement, then you are
  prompted twice. Different values can be entered at each prompt:&lt;/p&gt;

&lt;PRE&gt;    SQL&amp;gt; prompt Querying table &amp;amp;mytable
    Enter value for mytable: employees
    Querying table employees
    SQL&amp;gt; select employee_id from &amp;amp;mytable where last_name = 'Jones';
    Enter value for mytable: employees

    EMPLOYEE_ID
    -----------
            195
&lt;/PRE&gt;
&lt;p&gt;If a double ampersand reference causes SQL*Plus to prompt you for a value,
  then SQL*Plus defines the variable as that value. Any subsequent reference to
  the variable (even in the same command) using either "&amp;amp;" or "&amp;amp;&amp;amp;"
  substitutes the newly defined value. SQL*Plus will not prompt you again:&lt;/p&gt;

&lt;PRE&gt;    SQL&amp;gt; prompt Querying table &amp;amp;&amp;amp;mytable
    Enter value for mytable: employees
    Querying table employees
    SQL&amp;gt; select employee_id from &amp;amp;mytable where last_name = 'Jones';

    EMPLOYEE_ID
    -----------
            195
&lt;/PRE&gt;
&lt;h3&gt;&lt;A name=2_5&gt;&lt;/A&gt;2.5 Storing a Query Column Value in a Substitution Variable&lt;/h3&gt;
&lt;p&gt;Data stored in the database can be put into substitution variables:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; column last_name new_value mynv
    SQL&amp;gt; select last_name from employees where employee_id = 100;
&lt;/PRE&gt;
&lt;p&gt;The NEW_VALUE option in the COLUMN command implicitly creates a substitution

  variable called "mynv". The variable is not physically created until
a query references the column LAST_NAME.  When the query finishes, the
variable "mynv" holds
  the last retrieved value from column "last_name":&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define mynv
    DEFINE mynv      = "King" (CHAR)
&lt;/PRE&gt;
&lt;h3&gt;&lt;A name=2_6&gt;&lt;/A&gt;2.6 Predefined Substitution Variables&lt;/h3&gt;
&lt;p&gt;The predefined substitution variables created when you start SQL*Plus can be
  seen by entering DEFINE with no arguments. Each predefined variable is prefixed
  with an underscore. The predefined variables can be undefined or redefined just like user defined   substitution variables.

&lt;/p&gt;
&lt;p&gt;

In SQL*Plus Release 10.1 the predefined variables are:&lt;/p&gt;
&lt;PRE&gt;
    _CONNECT_IDENTIFIER
    _DATE
    _EDITOR
    _O_RELEASE
    _O_VERSION
    _PRIVILEGE
    _SQLPLUS_RELEASE
    _USER
&lt;/PRE&gt;

&lt;p&gt;The variables _DATE, _PRIVILEGE, and _USER were introduced in SQL*Plus 10.1.  The variable _CONNECT_IDENTIFIER was introduced in SQL*Plus 9.2.&lt;/p&gt;


&lt;p&gt;The variable _CONNECT_IDENTIFIER contains the connection identifier used to
  start SQL*Plus. For example, if the SQL*Plus connection string is "hr/&lt;I&gt;my_password&lt;/I&gt;@MYSID"
  then the variable contains MYSID. If you use a complete Oracle Net connection
  string like "hr/&lt;I&gt;my_password&lt;/I&gt;@(DESCRIPTION=(ADDRESS_LIST=...(SERVICE_NAME=MYSID.MYDOMAIN)))"
  then _CONNECT_IDENTIFIER will be set to MYSID. If the connect identifier is
  not explicitly specified then _CONNECT_IDENTIFIER contains the default connect
  identifier Oracle uses for connection. For example, on UNIX it will contain
  the value in the environment variable TWO_TASK or ORACLE_SID. If SQL*Plus is
  not connected then the variable is defined as an empty string.&lt;/p&gt;

&lt;p&gt;The variable _DATE can be either dynamic,
showing the current date or it can be set to a fixed string.  The date
is formatted using the value of &lt;a
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b10755/initparams123.htm#REFRN10119"&gt;NLS_DATE_FORMAT&lt;/a&gt;
and may show time information.  By default a DEFINE or dereference
using &amp;amp;_DATE will give the date at the time of use.  _DATE can be
UNDEFINED, or set to a fixed string with an explicit DEFINE command.
Dynamic date behavior is re-enabled by defining _DATE to an empty
string.&lt;/p&gt;

&lt;p&gt;The variable _EDITOR contains the external
text editor executable name. See &lt;A href="#5_4"&gt;5.4 EDIT
Command.&lt;/A&gt;&lt;/p&gt;

&lt;p&gt;The variable _O_RELEASE contains contains a
string representation of the Oracle database version number.  If your
Oracle database version is 9.2.0.3.0 then the variable contains
"902000300".  The Oracle version may be different from the SQL*Plus
version if you use Oracle Net to connect to a remote database.&lt;/p&gt;

&lt;p&gt;The variable _O_VERSION contains a text string showing the database version and available options.&lt;/p&gt;

&lt;p&gt;When SQL*Plus is connected as a privileged
user the variable _PRIVILEGE contains the connection privilege "AS
SYSBDA" or "AS SYSOPER".  If SQL*Plus is connected as a normal user
the variable is defined as an empty string.&lt;/p&gt;

&lt;p&gt;The variable _SQLPLUS_RELEASE contains the
SQL*Plus version number in a similar format to _O_RELEASE.&lt;/p&gt;

&lt;p&gt;The variable _USER contains the current
username given by SHOW USER.  If SQL*Plus is not connected, the
variable is defined as an empty string.&lt;/p&gt;

&lt;h3&gt;&lt;A name=2_7&gt;&lt;/A&gt;2.7 Script Parameters&lt;/h3&gt;
&lt;p&gt;Parameters can be passed to SQL*Plus scripts. For example, from the command
  line:&lt;/p&gt;
&lt;PRE&gt;    sqlplus hr/&lt;I&gt;my_password&lt;/I&gt; @myscript.sql King
&lt;/PRE&gt;
&lt;p&gt;You can also pass parameters when calling a SQL*Plus script from within a SQL*Plus
  session, for example:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; @myscript.sql King
&lt;/PRE&gt;
&lt;p&gt;Script parameters become defined substitution variables. The variable name
  for the first parameter is "1", the second is "2", etc. The effect is as if
  you start SQL*Plus and type:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define 1 = King
    SQL&amp;gt; @myscript.sql

&lt;/PRE&gt;
&lt;p&gt;Commands in &lt;I&gt;myscript.sql&lt;/I&gt; can reference "&amp;amp;1" to get the value "King". A DEFINE command shows
  the parameter variable:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define 1
    DEFINE 1      = "King" (CHAR)
&lt;/PRE&gt;
&lt;p&gt;Script parameter variables have type CHAR, similar to variables explicitly
  created with DEFINE.&lt;/p&gt;
&lt;p&gt;Quoting parameters with single or double quotes is allowed. This lets whitespace
  be used within parameters. Operating systems and scripting languages that call
  SQL*Plus handle quotes in different ways. They may or may not pass quotes to
  the SQL*Plus executable. For example, in a standard Bourne shell on UNIX, quotes
  around parameters are stripped before the parameters are passed to SQL*Plus,
  and SQL*Plus never sees the quotes.&lt;/p&gt;
&lt;p&gt;It is recommended to check how quoted parameters are handled on your operating
  system with your patch level of SQL*Plus. For portability between UNIX and Windows
  environments use double quotes around parameters containing
whitespace.&lt;/p&gt; &lt;p&gt;SQL*Plus Releases
8.1.7, 9.2.0.3 (and other 9.x versions patched for bug
  2471872) and 10.1 onwards remove an outer set of single or double quotes from parameters passed

  on the SQL*Plus command line. This makes SQL*Plus behave the same way on operating
  systems that do not themselves strip quotes as it does when the operating system
  strips the quotes before calling SQL*Plus.&lt;/p&gt;
&lt;p&gt;As an example of passing parameters, when SQL*Plus 10.1 is called
  in the UNIX shell script:&lt;/p&gt;
&lt;PRE&gt;    #! /bin/sh
    sqlplus hr/&lt;I&gt;my_password&lt;/I&gt; @myscript.sql "Jack and Jill"
&lt;/PRE&gt;
&lt;p&gt;only one program parameter is defined. References in &lt;I&gt;myscript.sql&lt;/I&gt; to
  "&amp;amp;1" are replaced with "Jack and Jill" (without quotes - because the shell
  script does not pass quotes to SQL*Plus).&lt;/p&gt;
&lt;p&gt;From SQL*Plus Release 9.0 onwards, an empty string can be passed as a parameter.&lt;/p&gt;
&lt;h3&gt;&lt;A name=2_8&gt;&lt;/A&gt;2.8 More on Substitution Variables&lt;/h3&gt;
&lt;p&gt;Substitution variable references are pre-processed and substituted &lt;I&gt;before&lt;/I&gt;
  the command is otherwise parsed and executed. For each statement SQL*Plus will:&lt;/p&gt;
&lt;PRE&gt;
    1. Loop for each "&amp;amp;" and "&amp;amp;&amp;amp;" variable reference
           If the variable is defined
               Replace the variable reference with the value
           else
               Prompt for a value
               Replace the variable reference with the value
               If the variable is prefixed with "&amp;amp;&amp;amp;" then
                   define (i.e. store) the variable for future use
    2. Execute the statement
&lt;/PRE&gt;


&lt;p&gt;Step 1 happens inside the SQL*Plus client
tool.  SQL*Plus then sends the final statement to the database engine
where step 2 occurs.&lt;/p&gt;


&lt;p&gt;It is not possible to repeatedly prompt in a
PL/SQL loop.  This example prompts once and the entered value is
substituted in the script text.  The resulting script is then sent to the
database engine for execution.  The same entered value is stored five
times in the table:&lt;/p&gt;

&lt;pre&gt;
    begin
      for i in 1 .. 5 loop
        insert into mytable values (&amp;amp;myv);
      end loop;
    end;
    /
&lt;/pre&gt;

&lt;p&gt;Substitution variables are not recursively expanded. If the value of a referenced
  variable contains an ampersand, then the ampersand is used literally and is
  not treated as a second variable prefix:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; set escape \
    SQL&amp;gt; define myv = \&amp;amp;mytext
    SQL&amp;gt; prompt &amp;amp;myv
    &amp;amp;mytext
&lt;/PRE&gt;
&lt;p&gt;You cannot use a substitution variable as the first token of a command. Each
  command name must be hard coded text otherwise an error is displayed. For example:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; &amp;amp;myv * from dual;
    SP2-0734: unknown command beginning "&amp;amp;myv * fro..." - rest of line ignored.
&lt;/PRE&gt;
&lt;p&gt;Substitution variables cannot be used in buffer editing commands like APPEND,
  CHANGE, DEL, and INPUT. Ampersands (&amp;amp;) in these commands are treated literally.&lt;/p&gt;
&lt;p&gt;If you wish to use alphanumeric characters immediately after a substitution

  variable name, put the value of SET CONCAT - by default a period (.) - to separate
  the variable name from the following characters. For example, if "mycity" is
  defined as "Melbourne" then:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; spool &amp;amp;mycity.Australia.log
&lt;/PRE&gt;
&lt;p&gt;is the same as:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; spool MelbourneAustralia.log
&lt;/PRE&gt;
&lt;p&gt;If you want to append a period immediately after a substitution variable name
  then use two periods together. For example, if "myfile" is defined as "reports"
  then the command:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; spool &amp;amp;myfile..log
&lt;/PRE&gt;
&lt;p&gt;is the same as:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; spool reports.log
&lt;/PRE&gt;
&lt;p&gt;Text in ANSI "/* */" or "--" comments that looks like a substitution variable
  may be treated as one, for example:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; select department_id, location_id /* get dept &amp;amp; loc */ from departments;
    Enter value for loc: _
&lt;/PRE&gt;
&lt;p&gt;Here the text "&amp;amp; loc" in the comment is interpreted as a variable reference.

  SQL*Plus prompts you for a value for the variable "loc".&lt;/p&gt;

&lt;A name=3&gt;&lt;/A&gt;
&lt;h2&gt;3 Using Bind Variables&lt;/h2&gt;

&lt;p&gt;Bind variables are used in SQL and PL/SQL statements for holding data or result
  sets. They are commonly used in SQL statements to optimize statement performance.

  A statement with a bind variable may be re-executed multiple times without needing
  to be re-parsed. Their values can be set and referenced in PL/SQL blocks. They
  can be referenced in SQL statements e.g. SELECT. Except in the VARIABLE and
  PRINT commands, bind variable references should be prefixed with a colon.&lt;/p&gt;
&lt;p&gt;Bind variables are created with the VARIABLE command. The following PL/SQL

  block sets a bind variable:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; variable bv number
    SQL&amp;gt; begin
      2    :bv := 8;
      3  end;
      4  /


    PL/SQL procedure successfully completed.
&lt;/PRE&gt;
&lt;p&gt;Once a value is set, you can show it with the PRINT command.&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; print bv

            BV
    ----------
             8
&lt;/PRE&gt;
&lt;p&gt;Numeric bind variables can be used in the EXIT command to return a value to
  the operating system:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; EXIT :bv
&lt;/PRE&gt;
&lt;p&gt;Other SQL*Plus commands do not recognize bind variables.&lt;/p&gt;

&lt;p&gt;There is no way to undefine or delete a bind variable in a SQL*Plus session.
  However, bind variables are not remembered when you exit SQL*Plus.&lt;/p&gt;
&lt;p&gt;For information about automatically displaying values and using REFCURSOR bind
  variables for whole result sets, see &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch6.htm#sthref1092"&gt;Using
  Bind Variables&lt;/A&gt; and &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2699801"&gt;VARIABLE&lt;/A&gt;,
  in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;A name=3_1&gt;&lt;/A&gt;3.1 Assigning Substitution Variables to Bind Variables&lt;/h3&gt;

&lt;p&gt;You can assign a substitution variable to a bind variable:&lt;/p&gt;
&lt;PRE&gt;
    SQL&amp;gt; define mysubv = 123
    SQL&amp;gt; variable mybndv number
    SQL&amp;gt; execute :mybndv := &amp;amp;mysubv;
&lt;/PRE&gt;
&lt;p&gt;SQL*Plus executes the PL/SQL assignment statement after it substitutes the value of "mysubv".
  If "mysubv" was not already defined, you would be prompted for a value.&lt;/p&gt;

&lt;p&gt;The bind variable can be used in subsequent SQL or PL/SQL commands.&lt;/p&gt;
&lt;h3&gt;&lt;A name=3_2&gt;&lt;/A&gt;3.2 Assigning Bind Variables to Substitution Variables&lt;/h3&gt;
&lt;p&gt;Sometimes it is useful to make the value of a bind variable available to SQL*Plus
  commands like TTITLE or SPOOL. For example, you might want to call a PL/SQL
  function that returns a string and use the value for a SQL*Plus spool file name.
  The SPOOL command does not understand bind variable syntax so the bind variable
  value needs to be assigned to a substitution variable first.&lt;/p&gt;
&lt;p&gt;This is done using COLUMN NEW_VALUE and  SELECT commands. For example,
  declare a bind variable in SQL*Plus and instantiate it in a PL/SQL block. Its
  value can be returned from a PL/SQL function, or like here, set by a direct
  assignment:&lt;/p&gt;

&lt;PRE&gt;    SQL&amp;gt; variable mybv varchar2(14)
    SQL&amp;gt; begin
      2    /* ... */
      3    :mybv := 'report.log';
      4  end;
      5  /
&lt;/PRE&gt;
&lt;p&gt;Pass the bind variable's value to a new substitution variable "nv" by using
  a query:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; column mybvcol new_value nv noprint
    SQL&amp;gt; select :mybv mybvcol from dual;
&lt;/PRE&gt;

&lt;p&gt;Now you can use the substitution variable in a SPOOL command:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; spool &amp;amp;nv
&lt;/PRE&gt;
&lt;p&gt;The SPOOL command executes as if you had typed&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; spool report.log&lt;/PRE&gt;


&lt;A name=4&gt;&lt;/A&gt;
&lt;h2&gt;4 Using System Variables&lt;/h2&gt;

&lt;p&gt;Most system variables are the SET command options used to control the behavior
  of the SQL*Plus system. For example, to set the output line size from SQL*Plus:&lt;/p&gt;

&lt;PRE&gt;    SQL&amp;gt; set linesize 60
&lt;/PRE&gt;
&lt;p&gt;The current status of each system variable can be displayed with the SHOW command.&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; show linesize
    linesize 80

&lt;/PRE&gt;
&lt;p&gt;System variables are sometimes known as &lt;I&gt;SET variables&lt;/I&gt;.&lt;/p&gt;
&lt;p&gt;Some system variables contain values that cannot be set. For example, RELEASE
  (a string representation of the SQL*Plus version) can only be shown.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2472"&gt;SET&lt;/A&gt;

  and &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2699447"&gt;SHOW&lt;/A&gt;
  in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;A name=4_1&gt;&lt;/A&gt;4.1 System Variables Influencing Substitution Variables&lt;/h3&gt;
&lt;p&gt;Several system variables influence substitution variables.&lt;/p&gt;
&lt;h4&gt;&lt;A name=4_1_1&gt;&lt;/A&gt;4.1.1 SET CONCAT&lt;/h4&gt;
&lt;p&gt;Use SET CONCAT to define the character that separates the name of a substitution

  variable from alphanumeric characters that immediately follow the variable name.
  By default it is a single period (.). &lt;/p&gt;
&lt;p&gt;For example, if "mycity" is defined as "Melbourne" then the command:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; spool &amp;amp;mycity.Australia.log
&lt;/PRE&gt;
&lt;p&gt;is the same as:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; spool MelbourneAustralia.log
&lt;/PRE&gt;

&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2677"&gt;SET
  CONCAT&lt;/A&gt; in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;A name=4_1_2&gt;&lt;/A&gt;4.1.2 SET DEFINE&lt;/h4&gt;
&lt;p&gt;Use SET DEFINE OFF to stop SQL*Plus performing any variable substitution. This
  makes SQL*Plus treat all ampersands (&amp;amp;) as literal characters and prevents
  SQL*Plus prompting you for values:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; set define off
    SQL&amp;gt; select 'B&amp;amp;W' MyHeading from dual;


     MYH
     ---
     B&amp;amp;W
&lt;/PRE&gt;
&lt;p&gt;The default substitution variable prefix is an ampersand (&amp;amp;). The SET DEFINE
  command can be used to change the variable-name prefix character. SET DEFINE
  ON turns variable substitution back on and resets the prefix character to "&amp;amp;"&lt;/p&gt;
&lt;p&gt;Sometimes in SQL*Plus literature you may see references to the SET SCAN command.
  This is an obsolete alternative for SET DEFINE. To ensure maximum portability

  of scripts use SET DEFINE.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2691"&gt;SET
  DEFINE&lt;/A&gt; in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;A name=4_1_3&gt;&lt;/A&gt;4.1.3 SET ESCAPE&lt;/h4&gt;
&lt;p&gt;Use SET ESCAPE to prevent isolated occurrences of "&amp;amp;" from being treated
  as the substitution variable prefix:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; set escape \
    SQL&amp;gt; select 'B\&amp;amp;W' MyHeading from dual;

     MYH

     ---
     B&amp;amp;W
&lt;/PRE&gt;
&lt;p&gt;Any "&amp;amp;" without the escape character is treated as a variable prefix.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2714"&gt;SET
  ESCAPE&lt;/A&gt; in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;A name=4_1_4&gt;&lt;/A&gt;4.1.4 SET NULL&lt;/h4&gt;
&lt;p&gt;SET NULL sets the text that SQL*Plus displays when a NULL data value is printed.&lt;/p&gt;
&lt;p&gt;A substitution variable may take the value of the SET NULL text if a COLUMN
  NEW_VALUE (or COLUMN OLD_VALUE) command associated the variable with a selected
  column and the current row contains a NULL value. The type of the substitution

  variable temporarily changes to CHAR while it contains NULL.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2789"&gt;SET
  NULL&lt;/A&gt; in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;A name=4_1_5&gt;&lt;/A&gt;4.1.5 SET NUMFORMAT&lt;/h4&gt;
&lt;p&gt;SET NUMFORMAT and SET NUMWIDTH interact. Use SET NUMFORMAT to change the default
  display format of a numeric variable. Use SET NUMFORMAT "" to remove the format.
  When there is no format, the default number formatting uses the SET NUMWIDTH
  option:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; show numformat
    numformat ""
    SQL&amp;gt; define myn
    DEFINE MYN             =     123.45 (NUMBER)

    SQL&amp;gt; set numformat 0999.9
    SQL&amp;gt; define myn
    DEFINE MYN             =  0123.5 (NUMBER)
    SQL&amp;gt; set numformat 9.9EEEE
    SQL&amp;gt; define myn
    DEFINE MYN             =   1.2E+02 (NUMBER)
    SQL&amp;gt; prompt The number is &amp;amp;myn
    The number is   1.2E+02
&lt;/PRE&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2793"&gt;SET
  NUMFORMAT&lt;/A&gt; in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;A name=4_1_6&gt;&lt;/A&gt;4.1.6 SET NUMWIDTH&lt;/h4&gt;
&lt;p&gt;SQL*Plus uses the value of SET NUMWIDTH only if there is no value for SET NUMFORMAT.

  Use SET NUMWIDTH to change the display width of a numeric variable:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; show numformat
    numformat ""
    SQL&amp;gt; show numwidth
    numwidth 15
    SQL&amp;gt; define myn
    DEFINE MYN             =     123.45 (NUMBER)
    SQL&amp;gt; set numwidth 6
    SQL&amp;gt; define myn
    DEFINE MYN             = 123.45 (NUMBER)
    SQL&amp;gt; set numwidth 15
    SQL&amp;gt; define myn
    DEFINE MYN             =          123.45 (NUMBER)
&lt;/PRE&gt;
&lt;p&gt;Note the value is right justified within the field width and the number of

  leading spaces changes in each example.&lt;/p&gt;

&lt;p&gt;SQL*Plus displays pound signs (#) if the
format or field width for a numeric substitution variable is too small
for the value.&lt;/p&gt;

&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2797"&gt;SET
NUMWIDTH&lt;/A&gt; in the &lt;I&gt;SQL*Plus User's Guide and
Reference&lt;/I&gt;.&lt;/p&gt;

&lt;h4&gt;&lt;A name=4_1_7&gt;&lt;/A&gt;4.1.7 SET SQLPROMPT&lt;/h4&gt;

&lt;p&gt;In SQL*Plus 10&lt;i&gt;g&lt;/i&gt;, substitution variables in
the prompt are dynamically substituted each time the prompt is
printed.  Like variables used in &lt;a
href="#5_7_1"&gt;TTITLE&lt;/a&gt;, they should not be prefixed
with '&amp;amp;' else they are  substituted only once when the SET SQLPROMPT
command is executed.&lt;/p&gt;

&lt;p&gt;This example shows the HR user setting the
prompt and re-connecting to the OE schema.  The &lt;a
href="#2_6"&gt;predefined substitution variables&lt;/a&gt; _USER
and _CONNECT_IDENTIFIER are used in the prompt to give the current
username and database:&lt;/p&gt;

&lt;pre&gt;
    SQL&amp;gt; set sqlprompt "_user'@'_connect_identifier:SQL&amp;gt; "
    HR@MYDB:SQL&amp;gt; connect system/manager
    SYSTEM@MYDB:SQL&amp;gt; disconnect
    @:SQL&amp;gt; connect oe/&lt;i&gt;my_password&lt;/i&gt;@otherdb
    OE@otherdb:SQL&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Each time the prompt is printed, SQL*Plus
checks each word to see if it is a defined substitution variable.  If
it is, it will have its value printed. Otherwise it is displayed
verbatim.  Text in nested quotes will never be substituted.  For
performance reasons, the word SQL in the default prompt "SQL&amp;gt; " is
never treated as a substitution variable.  &lt;/p&gt;

&lt;p&gt;Variables in the prompt are dynamically
substituted only when SET SQLPLUSCOMPATIBILITY is 10.1 or greater.
Otherwise, and for SQL*Plus versions 9.2 and earlier, "&amp;amp;"-prefixed
variables can be substituted once when the SET SQLPROMPT command is
executed.&lt;/p&gt;

&lt;h4&gt;&lt;A name=4_1_8&gt;&lt;/A&gt;4.1.8 SET VERIFY&lt;/h4&gt;

&lt;p&gt;Use SET VERIFY to control whether SQL*Plus echoes the old and new statement
  text when it substitutes a variable's value. SET VERIFY only has an effect on
  substitution variables used in SQL and PL/SQL statements:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; set verify on

    SQL&amp;gt; define myv = 100

    SQL&amp;gt; select last_name from employees where employee_id = &amp;amp;myv;
    old   1: select last_name from employees where employee_id = &amp;amp;myv

    new   1: select last_name from employees where employee_id = 100

    LAST_NAME
    -------------------------
    King


    SQL&amp;gt; set verify off

    SQL&amp;gt; select last_name from employees where employee_id = &amp;amp;myv;

    LAST_NAME
    -------------------------
    King
&lt;/PRE&gt;
&lt;p&gt;Variables used in SQL*Plus commands (like SET and TTITLE) are not verified.&lt;/p&gt;
&lt;p&gt;See &lt;A

href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2904"&gt;SET
  VERIFY&lt;/A&gt; in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;A name=4_2&gt;&lt;/A&gt;4.2 System Variables in Titles and EXIT&lt;/h3&gt;
&lt;p&gt;There is a special syntax to reference system variables in TTITLE, BTITLE,
  REPHEADER, REPFOOTER, and EXIT commands. The name of each special variable is
  the same as the SHOW option prefixed with "SQL.".&lt;/p&gt;
&lt;p&gt;The special variables that can be referenced include:&lt;/p&gt;
&lt;UL&gt;
  &lt;LI&gt;SQL.PNO - page number
  &lt;LI&gt;SQL.LNO - line number
  &lt;LI&gt;SQL.USER - current username
  &lt;LI&gt;SQL.RELEASE - SQL*Plus version
  &lt;LI&gt;SQL.SQLCODE - last Oracle "ORA" error number &lt;/LI&gt;
&lt;/UL&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; ttitle left 'Salary Report. Page: ' sql.pno
    SQL&amp;gt; select salary from employees;
    SQL&amp;gt; exit sql.sqlcode

&lt;/PRE&gt;
&lt;p&gt;System variables of numeric type e.g. SQL.SQLCODE are formatted using the same
  rules as numeric substitution variables.&lt;/p&gt;
&lt;p&gt;The variables cannot be prefixed with an "&amp;amp;" (see &lt;A
href="#5_7_1"&gt;5.7.1 Using "&amp;amp;" Prefixes With Title Variables&lt;/A&gt;).&lt;/p&gt;
&lt;p&gt;These variables are not substitution variables. The DEFINE command does not
  show them. They cannot be referenced in general commands. The system variables
  are not affected if you create substitution variables with the same name. For
  example, SQL.USER is not affected if you create a substitution variable called
  USER. The system variable SQL.RELEASE is not affected if the predefined substitution
  variable _O_RELEASE is changed.&lt;/p&gt;


&lt;A name=5&gt;&lt;/A&gt;
&lt;h2&gt;5 SQL*Plus Substitution Variable Commands&lt;/h2&gt;

&lt;p&gt;Substitution variables can be used to replace options and values in almost
  all SQL*Plus commands. Several of the commands have special significance for

  substitution variables. These are discussed below.&lt;/p&gt;
&lt;h3&gt;&lt;A name=5_1&gt;&lt;/A&gt;5.1 ACCEPT Command&lt;/h3&gt;
&lt;p&gt;The ACCEPT command always prompts for a variable's value, creating a new variable
  or replacing an existing one. ACCEPT has advantages over a double ampersand
  (&amp;amp;&amp;amp;) variable reference that causes a prompt. ACCEPT allows the prompting

  text to be customized and allows a default value to be specified. ACCEPT does
  type and format checking.&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; accept myv number default 10 prompt 'Enter a number: '
    Enter a number: _
&lt;/PRE&gt;
&lt;p&gt;In this example, if you enter alphabetic characters then an error is shown

  and you are re-prompted. If you press Enter without typing anything then the
  variable takes the value "10".&lt;/p&gt;
&lt;p&gt;The ACCEPT command understands numbers, strings and dates. If a FORMAT clause
  is used, SQL*Plus validates the input against the given format. If the input
  is not valid, you are re-prompted for a value. For a list of format models,
  see &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b10759/sql_elements004.htm#SQLRF00210"&gt;Format

  Models&lt;/A&gt; in the &lt;I&gt;Oracle Database SQL Reference 10&lt;i&gt;g&lt;/i&gt; Release 1&lt;/I&gt;.&lt;/p&gt;
&lt;p&gt;If a FORMAT specifier such as "A10" is used for a CHAR variable, the entered
  value may be any length up to and including 10 characters. &lt;/p&gt;
&lt;p&gt;If a FORMAT specifier is used for a NUMBER type, the allowed inputs depend
  on the specifier used. For example, a specifier of "9EEEE" (for exponential
  notation) allows "3e2" but not "300" or "12e2". A format specifier of "999.99"
  allows both "123.45" and "67" to be entered.&lt;/p&gt;
&lt;p&gt;DATE variables are validated against an explicitly supplied FORMAT or against

  the default session date format (like "DD-MON-YYYY"). &lt;/p&gt;
&lt;p&gt;After successful validation against the format model, variables are stored
  in the appropriate variable type. See &lt;A
href="#6_2"&gt;6.2 Substitution
  Variable Types&lt;/A&gt;. In particular, substitution variables created with an ACCEPT
  ... DATE command are stored with type CHAR.&lt;/p&gt;
&lt;p&gt;The ACCEPT ... HIDE option can be used to prevent the value you enter from
  being displayed on the screen. This can be useful for scripts that need to prompt
  for passwords. Note some operating systems cannot redirect batch program script

  output into an ACCEPT ... HIDE command.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref1738"&gt;ACCEPT&lt;/A&gt;
  in the&lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt; for the full ACCEPT command
  syntax.&lt;/p&gt;
&lt;h3&gt;&lt;A name=5_2&gt;&lt;/A&gt;5.2 COLUMN Command&lt;/h3&gt;
&lt;p&gt;The COLUMN NEW_VALUE and COLUMN OLD_VALUE commands can be used to associate
  a substitution variable with a SELECT column's data.&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; column department_id new_value dnv
&lt;/PRE&gt;

&lt;p&gt;When column "department_id" selected, a substitution variable "dnv" is created
  to hold each row of the column in turn. The variable remains defined after the
  query completes:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; select department_id
      2  from departments
      3  where department_id between 60 and 100;

    DEPARTMENT_ID
    -------------
               60
               70

               80
               90
              100

    SQL&amp;gt; define dnv
    DEFINE DNV             =        100 (NUMBER)
&lt;/PRE&gt;
&lt;p&gt;COLUMN OLD_VALUE and NEW_VALUE substitution variables can be used for basic
  numeric and text column types. They are used for any query executed that has
  a column of the same name as the COLUMN command. Their current value can be
  displayed in report headings and titles during query execution. &lt;/p&gt;
&lt;p&gt;COLUMN NEW_VALUE variables should be used in TTITLE and REPHEADER titles at

  start of a page. They hold data from the &lt;I&gt;new&lt;/I&gt; row about to be printed
  on the page. After the query finishes the variable has value of the last row.&lt;/p&gt;
&lt;p&gt;COLUMN OLD_VALUE variables are used in BTITLE and REPFOOTER titles at the end
  of a page. They contain data from the &lt;I&gt;old&lt;/I&gt; row most recently printed on
  the page. See &lt;A
href="#5_7"&gt;5.7 TTITLE, BTITLE,
  REPHEADER and REPFOOTER Commands&lt;/A&gt; for discussion and examples.&lt;/p&gt;
&lt;p&gt;Variables change type as required. If another query with the same column name
  is run, the variable may take on a new type. Also if a number column contains
  null values, a substitution variable on the column changes from type NUMBER
  to CHAR for that row. This lets it hold the current string for the SET NULL
  option. The variable changes back to NUMBER when the next numeric value is fetched.&lt;/p&gt;
&lt;p&gt;If no rows are selected by a query, and the substitution variable does not

  already exist, then a zero length CHAR variable is created. If the substitution
  variable exists then its value and type are not changed.&lt;/p&gt;
&lt;p&gt;Similar to the DATE option for the &lt;A
href="#5_1"&gt;ACCEPT&lt;/A&gt; command,
  a variable on a DATE column is stored as type CHAR.
&lt;p&gt;COLUMN NEW_VALUE and OLD_VALUE can be used to transfer a value from a bind
  variable to a substitution variable. See &lt;A
href="#3_2"&gt;3.2 Assigning
  Bind Variables to Substitution Variables&lt;/A&gt;.&lt;/p&gt;
&lt;p&gt;The COLUMN option NOPRINT can be used to suppress query results and stop them
  appearing in a final report.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2697128"&gt;COLUMN&lt;/A&gt;
  in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt; for the command syntax.&lt;/p&gt;

&lt;h3&gt;&lt;A name=5_3&gt;&lt;/A&gt;5.3 DEFINE Command&lt;/h3&gt;
&lt;p&gt;Use the DEFINE command to explicitly create substitution variables:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define myv = 'King'
&lt;/PRE&gt;
&lt;p&gt;The DEFINE command can also be used to display the value of a known variable.
  It shows the variable name, value and type:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define myv
    DEFINE MYV             = "King" (CHAR)
&lt;/PRE&gt;
&lt;p&gt;Using DEFINE with no arguments lists all defined substitution variables. Any
  variable that DEFINE lists is said to be &lt;I&gt;defined&lt;/I&gt;.&lt;/p&gt;
&lt;p&gt;A variable may be redefined by repeating the DEFINE command with a different
  value.&lt;/p&gt;
&lt;p&gt;The DEFINE command only ever creates variables with type CHAR.&lt;/p&gt;
&lt;p&gt;See &lt;A

href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2697507"&gt;DEFINE&lt;/A&gt;
  in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt; for the command syntax.&lt;/p&gt;
&lt;h3&gt;&lt;A name=5_4&gt;&lt;/A&gt;5.4 EDIT Command&lt;/h3&gt;
&lt;p&gt;The EDIT command starts an external editor such as Notepad or Vi. On most operating
  systems SQL*Plus has a &lt;A
href="#2_6"&gt;predefined substitution
  variable&lt;/A&gt; called _EDITOR set to the default editor's executable:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; define _editor
    DEFINE _EDITOR             = "Notepad" (CHAR)
&lt;/PRE&gt;
&lt;p&gt;EDIT can edit a named file. It can also edit the current SQL buffer (which
  holds the most recently executed SQL statement). When the external editor is
  closed the changed statement is loaded back into the SQL buffer. EDIT writes
  the SQL buffer to a temporary file called &lt;I&gt;afiedt.buf&lt;/I&gt;. The temporary file
  name can be changed with the SET EDITFILE command.&lt;/p&gt;
&lt;p&gt;You can redefine the value of the _EDITOR substitution variable to any editor.

&lt;/p&gt;
&lt;p&gt;On Windows _EDITOR can be set to "write.exe" to invoke WordPad. However, if
  the SQL buffer is being edited, the buffer is not automatically updated with
  the modified script. This is because SQL*Plus cannot tell when the WordPad editor
  has been closed.&lt;/p&gt;
&lt;p&gt;A recommended way to create SQL*Plus scripts is to explicitly specify a file
  name for EDIT and then use the START or "@" commands to run this file.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2203"&gt;EDIT&lt;/A&gt;  and &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2705"&gt;SET
  EDITFILE&lt;/A&gt;, both in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;A name=5_5&gt;&lt;/A&gt;5.5 EXIT Command&lt;/h3&gt;
&lt;p&gt;On many operating systems the EXIT command can pass the value of a numeric
  bind variable or substitution variable to the operating system environment.
  On UNIX, the return status from SQL*Plus can be displayed with the command "echo
  $?" in the Bourne, Korn and Bash shells, or with "echo $status" in the C shell.&lt;/p&gt;

&lt;p&gt;To return a substitution variable, it is recommended &lt;I&gt;not&lt;/I&gt; to use an ampersand
  prefix before its name. If you use "&amp;amp;" or "&amp;amp;&amp;amp;", the command preprocessor
  does the substitution using default number formatting rules (see &lt;A href="#6_3"&gt;6.3
  Substitution Variable Formats&lt;/A&gt;) before the EXIT command is finally parsed
  and executed. This is normal pre-processing of a numeric substitution variable
  in a command. Since the Oracle format specifier may include decimal and group
  separators which are not digits, or the number may overflow the format and be
  substituted as pound signs (#), there may be problems doing the final conversion
  from the resulting formatted string to the operating system return status. For
  example, if the formatting rules return exponential format and the number is
  formatted as "4E+05", then only the value "4" is returned to the operating system
  by the EXIT command.&lt;/p&gt;
&lt;p&gt;When "&amp;amp;" does not prefix the substitution variable name, e.g. "EXIT myv",
  SQL*Plus internally uses the more practical format specifier "9999999990" to
  convert from the internal number format to the string used as the EXIT command
  parameter.&lt;/p&gt;
&lt;p&gt;Note some operating systems limit the number range that can be returned from
  a program. On such systems the returned value may overflow and contain an unexpected

  number. This commonly limits the use of the &lt;A
href="#4_2"&gt;system variable&lt;/A&gt;
  SQL.SQLCODE which contains the last Oracle error number. Typically this number
  is larger than an operating system supports as an exit return status.&lt;/p&gt;
&lt;p&gt;If a non numeric variable is referenced in an EXIT statement the EXIT command
  exits but reports an error. The operating system return value is the same as
  for EXIT FAILURE.&lt;/p&gt;
&lt;p&gt;Substitution variables are not saved when SQL*Plus exits. Only the &lt;A
href="#2_6"&gt;predefined substitution
  variables&lt;/A&gt; and any variables set in the site and user profiles (e.g. &lt;I&gt;glogin.sql&lt;/I&gt;
  and &lt;I&gt;login.sql&lt;/I&gt;) are defined when you next start SQL*Plus.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2697968"&gt;EXIT&lt;/A&gt;
  in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;A name=5_6&gt;&lt;/A&gt;5.6 HOST Command&lt;/h3&gt;
&lt;p&gt;The HOST command runs a specified operating system command or opens a command
  window. On some operating systems a character like "!" or "$" is a synonym for
  HOST.&lt;/p&gt;
&lt;p&gt;After a HOST command finishes then the substitution variable _RC is defined.

  Its value is port specific and may contain a text message. On UNIX it is defined
  as "0" if the command is successful, or "1" if not. It may also be the operating
  exit status returned from the host program. On other platforms the value of
  _RC is not well defined and its value should not be relied on.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#sthref2272"&gt;HOST&lt;/A&gt;
  in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;A name=5_7&gt;&lt;/A&gt;5.7 TTITLE, BTITLE, REPHEADER and REPFOOTER Commands&lt;/h3&gt;
&lt;p&gt;Variables are used in report titles to make each page relate to the data on
  that page, for example to give the product item that the report page describes.
  Any substitution variable can be used in a title command. However, the COLUMN
  NEW_VALUE or OLD_VALUE commands are often used to associate variables with column
  values in a report query.&lt;/p&gt;
&lt;p&gt;Use NEW_VALUE variables in TTITLE and REPHEADER commands. Use OLD_VALUE variables
  in BTITLE and REPFOOTER commands. For example, the script:&lt;/p&gt;
&lt;PRE&gt;   column last_name new_value ttnv old_value btov
   ttitle left 'First employee is: ' ttnv
   btitle left 'Last employee is: ' btov
   select last_name from employees where department_id = 60 order by last_name;
&lt;/PRE&gt;

&lt;p&gt;gives the output:&lt;/p&gt;
&lt;PRE&gt;    First employee is: Austin
    LAST_NAME
    -------------------------
    Austin
    Ernst
    Hunold
    Lorentz
    Pataballa


    Last employee is: Pataballa
&lt;/PRE&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2699732"&gt;TTITLE&lt;/A&gt;,
  &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2697039"&gt;BTITLE&lt;/A&gt;,
  &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2698435"&gt;REPHEADER&lt;/A&gt;,
  and &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2698377"&gt;REPFOOTER&lt;/A&gt;

  in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;

&lt;h4&gt;&lt;A name=5_7_1&gt;&lt;/A&gt;5.7.1 Using "&amp;amp;" Prefixes With Title Variables&lt;/h4&gt;
&lt;p&gt;The title commands (TTITLE, BTITLE, REPHEADER and REPFOOTER) substitute variables
  differently to most other commands. (The exceptions are the &lt;A
href="#5_5"&gt;EXIT&lt;/A&gt; and &lt;a href="#4_1_7" &gt;SET SQLPROMPT&lt;/a&gt; commands, which are similar to the title commands). In general you do not need, and will
  not want, to put an "&amp;amp;" prefix before a variable name in a title command.
  For example, if your TTITLE command is:&lt;/p&gt;
&lt;PRE&gt;    ttitle left 'Urgent: ' &amp;amp;2 ' Days High: ' &amp;amp;days
&lt;/PRE&gt;
&lt;p&gt;you should possibly change it to:&lt;/p&gt;
&lt;PRE&gt;    ttitle left 'Urgent: ' 2 ' Days High: ' days
&lt;/PRE&gt;
&lt;p&gt;The guidelines for variables in titles are:&lt;/p&gt;
&lt;UL&gt;
  &lt;LI&gt;
    &lt;p&gt;If you want the same value for a variable to be printed on every page then
      use an "&amp;amp;" prefix and put the variable inside a quoted string:&lt;/p&gt;
    &lt;PRE&gt;    accept mycustomer char prompt 'Enter your company name: '
    ttitle left 'Report generated for company &amp;amp;mycustomer'
    select last_name, job_id from employees order by job_id;
&lt;/PRE&gt;

  &lt;LI&gt;
    &lt;p&gt;If you want each title to have data from the query that is unique to each
      report page then do not use an "&amp;amp;" prefix for the variable and do not
      put the variable inside quotes.&lt;/p&gt;
    &lt;PRE&gt;    column job_id new_value ji_nv noprint
    break on job_id skip page
    ttitle left 'Employees in job: ' ji_nv
    select last_name, job_id from employees order by job_id;
&lt;/PRE&gt;
  &lt;/LI&gt;
&lt;/UL&gt;
&lt;p&gt;SQL*Plus substitution variables are expanded before each command is executed.
  After this happens in a title command, the resulting string is stored as the
  title text. What makes variables in titles special is that they need to be re-substituted
  for each page of query results. This is so the current COLUMN NEW_VALUE and
  OLD_VALUE substitution variable values are displayed on each page, customizing
  each title for the results displayed on its page. If "&amp;amp;" is used inadvertently
  or incorrectly to prefix title variables, it is possible to get double substitution.
  This is dependent on the variable's value and is easily overlooked when you
  write scripts.&lt;/p&gt;
&lt;p&gt;Any non-quoted, non-keyword in a title is checked when the page is printed
  to see if it is a variable. If it is, its value is printed. If not, then the
  word is printed verbatim. This means that if you use "&amp;amp;myvar" in a title

  command, and the text substituted for it can itself be interpreted as another
  variable name then you get double variable substitution. For example, the script:&lt;/p&gt;
&lt;PRE&gt;   define myvar = scottsvar
   ttitle left &amp;amp;myvar

   define scottsvar = Hello

   select * from dual;
&lt;/PRE&gt;
&lt;p&gt;causes the text "left scottsvar" to be stored as the title. When the title
  is printed on each page of the query this string is re-evaluated. The word "scottsvar"
  in the title is itself treated as a variable reference and substituted. The
  query output is:&lt;/p&gt;
&lt;PRE&gt;   Hello
   D
   -
   X
&lt;/PRE&gt;
&lt;p&gt;Using "&amp;amp;" in titles most commonly causes a problem with the numeric variable
  names of the SQL*Plus &lt;A
href="#2_7"&gt;script parameters&lt;/A&gt;.
  If the value of an arbitrary "&amp;amp;"-prefixed title variable is the same as
  a script parameter variable name, then double substitution will occur.&lt;/p&gt;
&lt;p&gt;To display an "&amp;amp;" in a title, prefix it with the &lt;A

href="#4_1_3"&gt;SET ESCAPE&lt;/A&gt;
  character. The ampersand (&amp;amp;) is stored as the title text and is not substituted
  when page titles are printed.&lt;/p&gt;
&lt;h4&gt;&lt;A name=5_7_2&gt;&lt;/A&gt;5.7.2 Variables and Text Spacing in Titles&lt;/h4&gt;
&lt;p&gt;Unquoted whitespace in titles is removed. Use whitespace instead of the SET
  CONCAT character to separate variables from text that should appear immediately
  adjacent. Use whitespace inside quotes to display a space. For example, the
  script:&lt;/p&gt;
&lt;PRE&gt;    define myvar = 'ABC'
    ttitle left myvar myvar Text ' Other words'
    select ...;
&lt;/PRE&gt;
&lt;p&gt;gives a title of:&lt;/p&gt;
&lt;PRE&gt;    ABCABCText Other words
&lt;/PRE&gt;
&lt;h3&gt;&lt;A name=5_8&gt;&lt;/A&gt;5.8 UNDEFINE Command&lt;/h3&gt;
&lt;p&gt;Use UNDEFINE to remove a defined substitution variable:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; undefine myv
    SQL&amp;gt; define myv
    SP2-0135: symbol myv is UNDEFINED
&lt;/PRE&gt;
&lt;p&gt;Any variable not listed by DEFINE is said to be &lt;I&gt;undefined&lt;/I&gt;.&lt;/p&gt;
&lt;p&gt;Undefining unused substitution variables may help improve SQL*Plus performance
  because SQL*Plus can look up variables faster.  This is especially true when variables are used in the &lt;a href="#4_1_7" &gt;SQLPROMPT&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See &lt;A

href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2699781"&gt;UNDEFINE&lt;/A&gt;
  in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt; for the command syntax.&lt;/p&gt;
&lt;h3&gt;&lt;A name=5_9&gt;&lt;/A&gt;5.9 WHENEVER Command&lt;/h3&gt;
&lt;p&gt;Substitution variables used for return statuses in WHENEVER OSERROR EXIT or
  WHENEVER SQLERROR EXIT commands follow the same general guidelines as variables
  in &lt;A href="#5_5"&gt;EXIT commands&lt;/A&gt;.
  Specifically, no ampersand (&amp;amp;) prefix is required, for example:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; whenever sqlerror exit myv
&lt;/PRE&gt;
&lt;p&gt;Be careful of using an ampersand (&amp;amp;) prefix for substitution variables
  in WHENEVER ... EXIT commands. Using an ampersand causes the current value of
  the variable at the time the WHENEVER command is run to be used, not the value
  that is in effect when the program later exits. For example, in the script:&lt;/p&gt;
&lt;PRE&gt;    define myv = 5
    whenever sqlerror exit &amp;amp;myv
    define myv = 10
    -- This query should fail
    select * from non_existent_table;
&lt;/PRE&gt;
&lt;p&gt;the operating system return status is 5. This is because the WHENEVER statement
  is pre-processed and executed as if you typed:&lt;/p&gt;
&lt;PRE&gt;    whenever sqlerror exit 5
&lt;/PRE&gt;
&lt;p&gt;However, if you remove the ampersand:&lt;/p&gt;
&lt;PRE&gt;    define myv = 5
    whenever sqlerror exit myv

    define myv = 10
    -- This query should fail
    select * from non_existent_table;
&lt;/PRE&gt;
&lt;p&gt;the return status is "10" which is the value of "myv" at the time of exit.&lt;/p&gt;
&lt;p&gt;See &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm##i2700032"&gt;WHENEVER
  OSERROR&lt;/A&gt; and &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b12170/ch13.htm#i2700066"&gt;WHENEVER
  SQLERROR&lt;/A&gt; in the &lt;I&gt;SQL*Plus User's Guide and Reference&lt;/I&gt;.&lt;/p&gt;


&lt;A name=6&gt;&lt;/A&gt;
&lt;h2&gt;6 Substitution Variable Namespace, Types, Formats and Limits&lt;/h2&gt;

&lt;h3&gt;&lt;A name=6_1&gt;&lt;/A&gt;6.1 Substitution Variable Namespace&lt;/h3&gt;
&lt;p&gt;In a SQL*Plus session there is just one global name space for substitution

  variables. If you reconnect using CONNECT, or run subscripts using "@", all
  variables ever defined are available for use and may be overridden or undefined.&lt;/p&gt;
&lt;p&gt;When a child script finishes, all substitution variables it defined or changed
  are visible to the calling script. This is particularly noticeable when a subscript
  executed with "@" or START is given &lt;A

href="#2_7"&gt;script parameters&lt;/A&gt;.
  The parameters "&amp;amp;1" etc. get redefined and the parent script sees the
  new values.&lt;/p&gt;
&lt;p&gt;To minimize problems, and for general readability,   use symbolic variable names for command parameters. All other references should use
  the new variable name instead of "&amp;amp;1". For example:&lt;/p&gt;

&lt;PRE&gt;    define myuser = '&amp;amp;1'
    @myscript.sql King
    select first_name from employees where last_name = '&amp;amp;myuser';
&lt;/PRE&gt;
&lt;p&gt;The call to &lt;I&gt;myscript.sql&lt;/I&gt; changes the value of "&amp;amp;1" to "King". By saving the
  original value of "&amp;amp;1" in "myuser" and using "&amp;amp;myuser" instead of "&amp;amp;1" in the SELECT, the query executes correctly.&lt;/p&gt;

&lt;h3&gt;&lt;A name=6_2&gt;&lt;/A&gt;6.2 Substitution Variable Types&lt;/h3&gt;
&lt;p&gt;The substitution variable types stored by SQL*Plus are:&lt;/p&gt;
&lt;UL&gt;
  &lt;LI&gt;CHAR
  &lt;LI&gt;NUMBER &lt;/LI&gt;
  &lt;LI&gt;BINARY_FLOAT&lt;/LI&gt;
  &lt;LI&gt;BINARY_DOUBLE&lt;/LI&gt;
&lt;/UL&gt;
&lt;p&gt;The CHAR type is a generic text format similar to the database table VARCHAR2
  column type. All variables created by:&lt;/p&gt;

&lt;UL&gt;
  &lt;LI&gt;DEFINE
  &lt;LI&gt;from prompts for "&amp;amp;" variables
  &lt;LI&gt;from script parameters &lt;/LI&gt;
&lt;/UL&gt;
&lt;p&gt;are of type CHAR. This ensures that values entered are substituted verbatim
  with no conversion loss.&lt;/p&gt;

&lt;p&gt;Variables created by COLUMN NEW_VALUE or
OLD_VALUE for the columns in Oracle number format will have the type
NUMBER.  These substitution variables are stored in Oracle's internal
number representation as they are in the database.  This allows
display formats to be altered without any internal value loss.
Substitution variables of BINARY_FLOAT and BINARY_DOUBLE types are
similarly created for Oracle BINARY_FLOAT and BINARY_DOUBLE columns.
These variables are stored in native machine representation.  The CHAR
type is used for NEW_VALUE and OLD_VALUE variables with all other
column types.  &lt;/p&gt;

&lt;p&gt;There is no explicit DATE type. The DATE keyword in the ACCEPT command is used
  solely to allow correct format validation against a date format. Substitution
  variables created by ACCEPT ... DATE, or by COLUMN NEW_VALUE on a date column,
  are stored as type CHAR. For example:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; accept mydvar date format 'DD-MON-YYYY' prompt 'Enter a date: '
    Enter a date: 03-APR-2003
    SQL&amp;gt; define mydvar

    DEFINE MYDVAR              = "03-APR-2003" (CHAR)
&lt;/PRE&gt;
&lt;p&gt;If a variable already exists and is redefined, its old type is discarded and
  the new type used.&lt;/p&gt;
&lt;p&gt;The type of a substitution variable is generally transparent. Substitution
  variables are weakly typed. For example, a COLUMN NEW_VALUE variable takes on
  the particular type of the named column in each new query. It may also change
  type during a query. For example, the type of a substitution variable used on
  a NUMBER column changes from NUMBER to CHAR when a NULL value is fetched. It
  changes back to NUMBER when the next numeric value is fetched.&lt;/p&gt;
&lt;p&gt;No type comparison semantics are defined for any type since there is no direct

  comparison of variables. All variables are textually substituted before any
  SQL or PL/SQL statement that could do a comparison is executed.&lt;/p&gt;

&lt;h3&gt;&lt;A name=6_3&gt;&lt;/A&gt;6.3 Substitution Variable Formats&lt;/h3&gt;
&lt;p&gt;When a variable is substituted, or its value is shown by a DEFINE command,
  it is formatted as text before the command referencing the variable is finally
  executed.&lt;/p&gt;
&lt;p&gt;CHAR variables are substituted verbatim.&lt;/p&gt;
&lt;p&gt;NUMBER variables are formatted according to SET NUMWIDTH (by default) or SET
  NUMFORMAT (if you have explicitly set one):&lt;/p&gt;
&lt;p&gt;The display format of a number can be changed even after the variable is created.
  To show this, first create a NUMBER variable. You cannot use DEFINE to do this
  because it makes the type of all new variables CHAR. Instead use a COLUMN NEW_VALUE

  command which inherits the NUMBER type from a NUMBER column:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; column c2 new_val m
    SQL&amp;gt; select 1.1 c2 from dual

            C2
    ----------
           1.1

    SQL&amp;gt; define m
    DEFINE M               =        1.1 (NUMBER)
&lt;/PRE&gt;
&lt;p&gt;Changing the format affects the display of the number but not the stored value:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; set numformat 99.990

    SQL&amp;gt; define m
    DEFINE M               =   1.100 (NUMBER)
&lt;/PRE&gt;
&lt;p&gt;For a list of format models, see &lt;A
href="http://download-west.oracle.com/docs/cd/B12037_01/server.101/b10759/sql_elements004.htm#SQLRF00210"&gt;Format

  Models&lt;/A&gt; in the &lt;I&gt;Oracle Database SQL Reference 10&lt;i&gt;g&lt;/i&gt; Release 1&lt;/I&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;A name=6_4&gt;&lt;/A&gt;6.4 Substitution Variable Limits&lt;/h3&gt;
&lt;p&gt;The maximum number of substitution variables allowed is 2048. SQL*Plus gives
  an error an attempt is made to create more. The limit includes the predefined
  variables, however these can be undefined if necessary. Leaving a large number
  of unnecessarily defined variables can reduce the performance of SQL*Plus because
  variable lookups are slower.&lt;/p&gt;
&lt;p&gt;A character substitution variable can be up to 240 bytes long.&lt;/p&gt;
&lt;p&gt;A numeric substitution variable holds the full range of Oracle numbers. See

  &lt;A
href="http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/sql_elements001.htm#sthref85"&gt;NUMBER
  Datatype&lt;/A&gt; in the &lt;I&gt;Oracle Database SQL Reference 10&lt;i&gt;g&lt;/i&gt; Release 1&lt;/I&gt;.&lt;/p&gt;
&lt;p&gt;When a command line undergoes variable substitution, the resulting line length
  can be no more than:&lt;/p&gt;
&lt;UL&gt;
  &lt;LI&gt;3000 bytes if it is a line of SQL (like SELECT or INSERT) or PL/SQL text
      (like BEGIN or CREATE PROCEDURE)&lt;/li&gt;
  &lt;LI&gt;2499 bytes if it a line of a SQL*Plus command (like TTITLE or COLUMN)  &lt;/LI&gt;
&lt;/UL&gt;
&lt;p&gt;Otherwise an error is displayed.&lt;/p&gt;
&lt;p&gt;These limits may be lower in old versions of SQL*Plus.&lt;/p&gt;


&lt;A name=7&gt;&lt;/A&gt;
&lt;h2&gt;7 &lt;I&gt;i&lt;/I&gt;SQL*Plus and Substitution Variables&lt;/h2&gt;

&lt;p&gt; &lt;I&gt;i&lt;/I&gt;SQL*Plus Release 10.1 interactively prompts
for substitution values as the statement referencing them is executed.
Each undefined variable is prompted for on its own HTML page. This is
similar to command-line SQL*Plus.&lt;/p&gt;

&lt;p&gt;Sometimes it is convenient to prompt for
more than one value at a time.  A separate HTML form can be used to
prompt for all input.  The values can be passed to &lt;I&gt;i&lt;/I&gt;SQL*Plus as
script parameters and referenced as substitution variables.  See &lt;a
href="#7_2" &gt;7.2 &lt;I&gt;i&lt;/I&gt;SQL*Plus Parameters&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;&lt;A name=7_1&gt;&lt;/A&gt;7.1 &lt;I&gt;i&lt;/I&gt;SQL*Plus 9&lt;i&gt;i&lt;/i&gt; and SQL*Plus Substitution Variable Compatibility&lt;/h3&gt;

&lt;p&gt;The prompting model is different in
&lt;I&gt;i&lt;/I&gt;SQL*Plus 9i.  When a script is run in &lt;I&gt;i&lt;/I&gt;SQL*Plus Release
9.0 or 9.2, a single HTML page for undefined substitution variables is
displayed. After you enter a value for each variable, the script
executes and generates its results.&lt;/p&gt;

&lt;p&gt;Some differences may be noticed between
command-line SQL*Plus and &lt;I&gt;i&lt;/I&gt;SQL*Plus Releases 9.0 or 9.2 when
your script does one of the following:&lt;/p&gt; &lt;UL&gt;

  &lt;LI&gt;contains DEFINE&lt;/li&gt;
  &lt;LI&gt;contains UNDEFINE&lt;/li&gt;
  &lt;LI&gt;contains SET DEFINE&lt;/li&gt;
  &lt;LI&gt;uses "&amp;amp;" and "&amp;amp;&amp;amp;" prefixes for the same variable&lt;/li&gt;
&lt;/UL&gt;

&lt;p&gt;These differences include being
unnecessarily prompted in &lt;I&gt;i&lt;/I&gt;SQL*Plus for values, and an empty
string being used instead of the expected value.  These problems do
not occur in iSQL*Plus 10.1.&lt;/p&gt;

&lt;p&gt;&lt;I&gt;i&lt;/I&gt;SQL*Plus Releases 9.0 and 9.2 cannot prompt for input in the middle
  of an executing script. This is due to the way the &lt;I&gt;i&lt;/I&gt;SQL*Plus
server interacts
  with the SQL*Plus engine. (The engine is the same statement-executing code used
  by command-line SQL*Plus. The &lt;I&gt;i&lt;/I&gt;SQL*Plus server generates the &lt;I&gt;i&lt;/I&gt;SQL*Plus

  HTML interface and handles HTTP requests). If a script explicitly changes variable
  definitions, for example by undefining a variable, then &lt;I&gt;i&lt;/I&gt;SQL*Plus cannot
  subsequently prompt for a new value. In this example an empty string is used
  instead.&lt;/p&gt;
&lt;p&gt;In &lt;I&gt;i&lt;/I&gt;SQL*Plus, parsing for "&amp;amp;" is performed twice, once by the &lt;I&gt;i&lt;/I&gt;SQL*Plus
  server and once by the SQL*Plus engine. The &lt;I&gt;i&lt;/I&gt;SQL*Plus server scans each
  script for "&amp;amp;" and "&amp;amp;&amp;amp;" references and creates a page with entry
  fields for undefined variables. When you have given values for the variables,

  they are transparently sent to the engine as DEFINE commands at the start of
  your script.&lt;/p&gt;
&lt;p&gt;For example, if you start &lt;I&gt;i&lt;/I&gt;SQL*Plus Release 9.x and enter:&lt;/p&gt;
&lt;PRE&gt;    define mytable = employees

    break on &amp;amp;sortcol

    select &amp;amp;sortcol, salary
    from &amp;amp;mytable

    where salary &amp;gt; 12000
    order by &amp;amp;sortcol
&lt;/PRE&gt;
&lt;p&gt;the &lt;I&gt;i&lt;/I&gt;SQL*Plus server:&lt;/p&gt;
&lt;OL&gt;
  &lt;LI&gt;
    Finds the session's current values of SET DEFINE, SET ESCAPE and SET CONCAT.
      By default these are "&amp;amp;", OFF and "." respectively. (The values of SET
      ESCAPE and SET CONCAT are not relevant for this example.)
  &lt;LI&gt;

    Parses the script as if it were a single stream of arbitrary words. Since
      SET DEFINE is not OFF, all "&amp;amp;" variables that were undefined prior to
      the script being started are recorded. In this example these are "sortcol"
      and "mytable". No SQL*Plus statements are recognized or processed so the
      "define mytable" is ignored and the &lt;I&gt;i&lt;/I&gt;SQL*Plus server records that
      an unknown variable "mytable" was referenced in the line "from &amp;amp;mytable".
  &lt;LI&gt;
    Creates a page prompting for values of "sortcol" and "mytable". Each variable
      name occurs only once on the page.
  &lt;LI&gt;
    After you enter a value for each variable on the page and click "OK", &lt;I&gt;i&lt;/I&gt;SQL*Plus

      prepends explicit DEFINE commands for the variables and their values to
      your script. Because only single "&amp;amp;" prefixes were used in this example,
      &lt;I&gt;i&lt;/I&gt;SQL*Plus also appends matching UNDEFINE commands at the end of the
      script. All extra commands are removed when the script finishes and do not
      display in the &lt;I&gt;i&lt;/I&gt;SQL*Plus Work screen.
  &lt;/LI&gt;
&lt;/OL&gt;
&lt;p&gt;The modified script is then sent to the SQL*Plus engine for processing. The
  engine:&lt;/p&gt;
&lt;OL&gt;
  &lt;LI&gt;
    Finds the session's current values of SET DEFINE, SET ESCAPE and SET CONCAT.

      These are still "&amp;amp;", OFF and "." respectively. Again, only the value
      of SET DEFINE is relevant to this example.&lt;/li&gt;
  &lt;LI&gt;
    &lt;p&gt;When the script in this example is run then the two variables get defined
      by the new, transparently added, DEFINE commands. The script's original
      define of "mytable" runs next and its value "employees" is the one finally
      used by the rest of the script.&lt;/p&gt;
    &lt;p&gt;Since SET DEFINE is not OFF, when "&amp;amp;sortcol" and "&amp;amp;mytable" are
      seen by the engine's preprocessor, the defined values are used.&lt;/p&gt;
    &lt;p&gt;At the conclusion of the script, the two variables are undefined in the
      session by the explicit UNDEFINE commands of the transparently modified
      script. &lt;/p&gt;
  &lt;/LI&gt;

&lt;/OL&gt;
&lt;p&gt;The undesired behavior in this example is being prompted for a value for "mytable"
  despite the script explicitly defining it. However, the prompted value is not
  used and the correct results are displayed.&lt;/p&gt;
&lt;p&gt;The &lt;I&gt;i&lt;/I&gt;SQL*Plus server creates the page to enter variable values unless
  SET DEFINE is OFF &lt;I&gt;before&lt;/I&gt; the script is submitted to the SQL*Plus engine
  for execution. To stop &lt;I&gt;i&lt;/I&gt;SQL*Plus prompting for "&amp;amp;" values, make sure
  DEFINE is OFF. In &lt;I&gt;i&lt;/I&gt;SQL*Plus Release 9.2 go to the System Variable page
  and change the DEFINE radio button to OFF. Then execute your script. In &lt;I&gt;i&lt;/I&gt;SQL*Plus
  Release 9.0 you need to execute an explicit second script containing "SET DEFINE
  OFF" prior to entering and executing the main script.&lt;/p&gt;
&lt;p&gt;If you want to use "&amp;amp;" prefixed variables in a script but know all values
  are generated in the script (using DEFINE, COLUMN NEW_VALUE or OLD_VALUE) then
  make sure SET DEFINE is OFF prior to executing the script (to stop the variable

  entry page being displayed). Also make the first line of the script "SET DEFINE
  ON" (to allow the SQL*Plus engine to do variable substitution using the script-created
  variables) and make the last line "SET DEFINE OFF" (to prevent subsequent re-executions
  of the script from unnecessarily creating the variable entry page).&lt;/p&gt;
&lt;p&gt;If you want the main script to prompt for some values, but not others, explicitly
  define these latter variables before running your main script. The variables
  you explicitly define do not generate prompts when the main script is later
  executed. These variables can be defined by executing an initial script containing
  DEFINE commands. This initial script does not have to give valid values to the
  variables if the main script is later going to provide them. When the main script
  is run, &lt;I&gt;i&lt;/I&gt;SQL*Plus sees that the variables have already been defined in
  the current session and does not include them on the variable entry page.&lt;/p&gt;
&lt;p&gt;If variables you do want to be prompted for in a script are prefixed with "&amp;amp;&amp;amp;"
  then make sure the script undefines them at its end. Otherwise the variables
  become defined in the session. When the script is re-run &lt;I&gt;i&lt;/I&gt;SQL*Plus sees

  the variables have a value and does not include them on the variable entry page.
  Explicitly undefining the variables allows the script to re-prompt for values
  each time it is run. &lt;/p&gt;
&lt;h3&gt;&lt;A name=7_2&gt;&lt;/A&gt;7.2 &lt;I&gt;i&lt;/I&gt;SQL*Plus Parameters&lt;/h3&gt;
&lt;p&gt;Variables can be passed to &lt;I&gt;i&lt;/I&gt;SQL*Plus dynamic reports using the URL syntax.
  These become defined as if they are named parameters. For example, the &lt;I&gt;i&lt;/I&gt;SQL*Plus 10.1
  URL:&lt;/p&gt;
&lt;pre&gt;
    http://machine/isqlplus/dynamic?script=http://machine/mys.sql&amp;amp;myv=emp
&lt;/pre&gt;
&lt;p&gt;would define "myv" as "emp" and then run &lt;I&gt;mys.sql&lt;/I&gt;. The script can reference
  "&amp;amp;myv".  In SQL*Plus 9.2, the equivalent URL is:&lt;/p&gt;

&lt;PRE&gt;    http://machine/isqlplus?script=http://machine/mys.sql&amp;amp;myv=emp
&lt;/PRE&gt;


&lt;p&gt;For compatibility with command-line SQL*Plus scripts, you can use numeric names
  for parameters, e.g. "1=employees"&lt;/p&gt;
&lt;p&gt;The "&amp;amp;" in the URL is the character for separating URL variables. It is
  only coincidentally the same as the default SQL*Plus substitution variable prefix
  and cannot be changed using SET DEFINE.&lt;/p&gt;


&lt;A name=8&gt;&lt;/A&gt;
&lt;h2&gt;8 Substitution Variable Summary&lt;/h2&gt;

&lt;p&gt;SQL*Plus substitution variables can be used to customize reports and can be
  used instead of hard-coded text. Substitution variables can interact with bind

  and system variables.  Substitution variables that have values stored are said to be &lt;i&gt;defined&lt;/i&gt;.&lt;/p&gt;
&lt;UL&gt;
  &lt;LI&gt;
    &lt;p&gt;Substitution variables can be defined explicitly:&lt;/p&gt;
    &lt;UL&gt;

      &lt;LI&gt;
        &lt;p&gt;with ACCEPT&lt;/p&gt;
      &lt;LI&gt;
        &lt;p&gt;with DEFINE&lt;/p&gt;
      &lt;LI&gt;
        &lt;p&gt;by passing parameters to SQL*Plus or &lt;I&gt;i&lt;/I&gt;SQL*Plus scripts&lt;/p&gt;

      &lt;/LI&gt;
    &lt;/UL&gt;
  &lt;LI&gt;
    &lt;p&gt;Substitution variables can be defined implicitly:&lt;/p&gt;
    &lt;UL&gt;
      &lt;LI&gt;
        &lt;p&gt;with a COLUMN NEW_VALUE or COLUMN OLD_VALUE command&lt;/p&gt;

      &lt;LI&gt;
        &lt;p&gt;by using a double ampersand (&amp;amp;&amp;amp;) prefix on an undefined variable&lt;/p&gt;
      &lt;/LI&gt;
    &lt;/UL&gt;
  &lt;LI&gt;
    &lt;p&gt;Substitution variables references have an "&amp;amp;" or "&amp;amp;&amp;amp;" prefix.&lt;/p&gt;
  &lt;LI&gt;
    &lt;p&gt;If a variable is referenced but is not defined, SQL*Plus stops and prompts

      for a value.&lt;/p&gt;
  &lt;LI&gt;
    &lt;p&gt;Substitution variable references are pre-processed and substituted &lt;I&gt;before&lt;/I&gt;
      the command is otherwise parsed and executed.&lt;/p&gt;
  &lt;LI&gt;
    &lt;p&gt;Substitution variables have a current type, such as CHAR. Substitution
      variables are weakly typed and change type as necessary.&lt;/p&gt;
  &lt;LI&gt;
    &lt;p&gt;Values are substituted as text. So even if the type of a variable is NUMBER,

      its value is formatted as a text string, substituted, and then the command
      executed.&lt;/p&gt;
  &lt;LI&gt;
    &lt;p&gt;In titles, EXIT and SET SQLPROMPT, substitution variables do not have to be prefixed with
      "&amp;amp;" or "&amp;amp;&amp;amp;".&lt;/p&gt;
  &lt;LI&gt;
    &lt;p&gt;The predefined substitution variables are named with a leading underscore
      (_). They can be undefined or redefined.&lt;/p&gt;
  &lt;/LI&gt;
&lt;/UL&gt;


&lt;A name=9&gt;&lt;/A&gt;
&lt;h2&gt;9 Substitution Variable Examples&lt;/h2&gt;

&lt;h3&gt;&lt;A name=9_1&gt;&lt;/A&gt;9.1 Setting a Substitution Variable's Value&lt;/h3&gt;

&lt;p&gt;A substitution variable can be set in several ways. The common ways are given
  below.&lt;/p&gt;
&lt;OL&gt;

  &lt;LI&gt;
    &lt;p&gt;The DEFINE command sets an explicit value:&lt;/p&gt;
    &lt;PRE&gt;    define myv = 'King'
&lt;/PRE&gt;

    &lt;p&gt;This creates a character variable "myv" set to the value "King".&lt;/p&gt;
  &lt;LI&gt;
    &lt;p&gt;The ACCEPT command:&lt;/p&gt;
    &lt;PRE&gt;    accept myv char prompt 'Enter a last name: '
&lt;/PRE&gt;

    &lt;p&gt;prompts you for a value and creates a character variable "myv" set to the
      text you enter.&lt;/p&gt;
  &lt;LI&gt;
    &lt;p&gt;Using "&amp;amp;&amp;amp;" before an undefined variable prompts you for a value
      and uses that value in the statement:&lt;/p&gt;
&lt;PRE&gt;
    select first_name from employees where last_name = '&amp;amp;&amp;amp;myuser';
&lt;/PRE&gt;
    &lt;p&gt;If the substitution variable "myuser" is not already defined then this
      statement creates "myuser" and sets it to the value you enter.&lt;/p&gt;
  &lt;LI&gt;
    &lt;p&gt;Using COLUMN NEW_VALUE to set a substitution variable to a value stored
      in the database:&lt;/p&gt;
&lt;PRE&gt;
    column last_name new_value mynv
    select last_name from employees where employee_id = 100;
&lt;/PRE&gt;
    &lt;p&gt;This creates a substitution variable "mynv" set to the value in the "last_name"
      column.&lt;/p&gt;
  &lt;/LI&gt;
&lt;/OL&gt;
&lt;h3&gt;&lt;A name=9_2&gt;&lt;/A&gt;9.2 Using a Substitution Variable&lt;/h3&gt;
&lt;p&gt;Once a substitution variable has a value, it can be referenced by prefixing

  the variable name with an ampersand (&amp;amp;).&lt;/p&gt;

&lt;p&gt;If the variable "myv" is already defined it
can be used like:&lt;/p&gt;

&lt;PRE&gt;
    select employee_id from employees where last_name = '&amp;amp;myv';
&lt;/PRE&gt;

&lt;h3&gt;&lt;A name=9_3&gt;&lt;/A&gt;9.3 Finding All Defined Substitution Variables&lt;/h3&gt;
&lt;p&gt;The DEFINE command with no parameters shows all defined substitution variables,
  their values, and their types. For example:&lt;/p&gt;
&lt;PRE&gt;    define
&lt;/PRE&gt;

&lt;p&gt;might give:&lt;/p&gt;
&lt;PRE&gt;    DEFINE MYV             = "King" (CHAR)
    ...
&lt;/PRE&gt;
&lt;h3&gt;&lt;A name=9_4&gt;&lt;/A&gt;9.4 Inserting Data Containing "&amp;amp;" Without Being Prompted&lt;/h3&gt;
&lt;p&gt;There are two ways to make an "&amp;amp;" be treated as text and not cause a prompt.
  The first turns all variable substitution off:&lt;/p&gt;
&lt;PRE&gt;    set define off
    create table mytable (c1 varchar2(20));
    insert into mytable (c1) values ('thick &amp;amp; thin');

&lt;/PRE&gt;
&lt;p&gt;The INSERT statement stores the text "thick &amp;amp; thin" in the table.&lt;/p&gt;
&lt;p&gt;The second method is useful for ignoring individual occurrences of "&amp;amp;"
  while allowing others to prefix substitution variables:&lt;/p&gt;
&lt;PRE&gt;    set escape \
    create table mytable (c1 varchar2(20));
    insert into mytable (c1) values ('thick \&amp;amp; thin');
    insert into mytable (c1) values ('&amp;amp;mysubvar');
&lt;/PRE&gt;
&lt;p&gt;The first INSERT statement in this method stores the text "thick &amp;amp; thin"
  in the table. The second INSERT causes SQL*Plus to prompt you for a value, which

  is then stored.&lt;/p&gt;
&lt;h3&gt;&lt;A name=9_5&gt;&lt;/A&gt;9.5 Putting the Current Date in a Spool File Name&lt;/h3&gt;
&lt;p&gt;Using SYSDATE you can query the current date and put it in a substitution variable.
  The substitution variable can then be used in a SPOOL command:&lt;/p&gt;
&lt;PRE&gt;    column dcol new_value mydate noprint
    select to_char(sysdate,'YYYYMMDD') dcol from dual;

    spool &amp;amp;mydate.report.txt
    -- my report goes here
    select last_name from employees;
    spool off
&lt;/PRE&gt;

&lt;p&gt;In this example the first query puts the date in the substitution variable
  "mydate". There is no visible output from this query because of the NOPRINT
  option in the COLUMN command. In the SPOOL command the first period (.) indicates
  the end of the variable name and is not included in the resulting string. If
  "mydate" contained "20030120" from the first query then the spool file name
  would be "20030120report.txt".&lt;/p&gt;
&lt;p&gt;You can use this technique to build up any string for the file name.&lt;/p&gt;
&lt;p&gt;The period is the default value of SET CONCAT. If you have assigned another
  character then use it instead of a period to end the substitution variable name.&lt;/h3&gt;
&lt;h3&gt;&lt;A name=9_6&gt;&lt;/A&gt;9.6 Appending Alphanumeric Characters Immediately After a Substitution Variable&lt;/h3&gt;
&lt;p&gt;If you wish to append alphanumeric characters immediately after a substitution
  variable, use the value of SET CONCAT to separate the variable name from the

  following text. The default value of SET CONCAT is a single period (.). For
  example:&lt;/p&gt;
&lt;PRE&gt;    define mycity = Melbourne
    spool &amp;amp;mycity.Australia.txt
&lt;/PRE&gt;
&lt;p&gt;creates a file with the name "MelbourneAustralia.txt"&lt;/p&gt;
&lt;h3&gt;&lt;A name=9_7&gt;&lt;/A&gt;9.7 Putting a Period After a Substitution Variable&lt;/h3&gt;
&lt;p&gt;If SET CONCAT is a period (.) and you want to append a period immediately after
  a substitution variable then use two periods together. For example:&lt;/p&gt;
&lt;PRE&gt;    define mycity = Melbourne
    spool &amp;amp;mycity..log
&lt;/PRE&gt;
&lt;p&gt;is the same as:&lt;/p&gt;
&lt;PRE&gt;    spool Melbourne.log

&lt;/PRE&gt;
&lt;h3&gt;&lt;A name=9_8&gt;&lt;/A&gt;9.8 Using a Fixed Value Variable in a TTITLE, BTITLE, REPHEADER or REPFOOTER&lt;/h3&gt;
&lt;p&gt;This example makes every page of a report have exactly the same heading. It
  can be used for TTITLE, BTITLE, REPHEADER or REPFOOTER commands.&lt;/p&gt;
&lt;p&gt;In a TTITLE command prefix the variable name "dept" with "&amp;amp;" and place
  it inside a quoted string:&lt;/p&gt;
&lt;PRE&gt;    define dept = '60'
    ttitle left 'Salaries for department &amp;amp;dept'
    select last_name, salary from employees where department_id = &amp;amp;dept;
&lt;/PRE&gt;
&lt;h3&gt;&lt;A name=9_9&gt;&lt;/A&gt;9.9 Using a Changing Value Variable in a TTITLE, BTITLE, REPHEADER or REPFOOTER&lt;/h3&gt;
&lt;p&gt;This example uses a different title on every page of a report. Each title contains
  a value derived from query results shown on that particular page.&lt;/p&gt;

&lt;p&gt;In a TTITLE command do not put an "&amp;amp;" before the variable name "dv". Put
  the variable name outside a quoted string:&lt;/p&gt;
&lt;PRE&gt;    column department_id new_value dv noprint
    ttitle left 'Members of department ' dv
    break on department_id skip page
    select department_id, last_name from employees order by department_id, last_name;
&lt;/PRE&gt;
&lt;p&gt;In a BTITLE or REPFOOTER command use a COLUMN OLD_VALUE variable instead of
  a COLUMN NEW_VALUE variable.&lt;/p&gt;
&lt;h3&gt;&lt;A name=9_10&gt;&lt;/A&gt;9.10 Using the Value of a Bind Variable in a SQL*Plus Command  Like SPOOL&lt;/h3&gt;
&lt;p&gt;If you want to use the value of a bind variable in a SQL*Plus command it must
  first be copied to a substitution variable.&lt;/p&gt;
&lt;p&gt;SQL*Plus commands like SPOOL, SET and TTITLE are executed in the SQL*Plus program
  and are not passed to the database for execution. Because of this they do not
  understand bind variables.&lt;/p&gt;

&lt;p&gt;To use a bind variable's value as the name of a spool file:&lt;/p&gt;
&lt;PRE&gt;    -- Set a bind variable to a text string
    variable mybindvar varchar2(20)
    begin
      :mybindvar := 'myspoolfilename';
    end;

    -- Transfer the value from the bind variable to the substitution variable
    column mc new_value mysubvar noprint
    select :mybindvar mc from dual;

    -- Use the substitution variable
    spool &amp;amp;mysubvar..txt
    select * from employees;
    spool off
&lt;/PRE&gt;
&lt;h3&gt;&lt;A name=9_11&gt;&lt;/A&gt;9.11 Passing Parameters to SQL*Plus Substitution Variables&lt;/h3&gt;

&lt;p&gt;You can pass parameters on the command line to a SQL*Plus script:&lt;/p&gt;
&lt;PRE&gt;    sqlplus hr/&lt;I&gt;my_password&lt;/I&gt; @myscript.html employees "De Haan"
&lt;/PRE&gt;
&lt;p&gt;They can be referenced in the script using "&amp;amp;1" and "&amp;amp;2". For example,
  &lt;I&gt;myscript.sql&lt;/I&gt; could be:&lt;/p&gt;
&lt;PRE&gt;    set verify off
    select employee_id from &amp;amp;1 where last_name = '&amp;amp;2';
&lt;/PRE&gt;
&lt;p&gt;Here the "SET VERIFY OFF" command stops SQL*Plus from echoing the SQL statement
  before and after the variables are substituted. The query returns the employee
  identifier for the employee "De Haan" from the "employees" table.&lt;/p&gt;
&lt;p&gt;Parameters can also be passed to scripts called within SQL*Plus:&lt;/p&gt;
&lt;PRE&gt;    SQL&amp;gt; @myscript.sql employees "De Haan"
&lt;/PRE&gt;
&lt;h3&gt;&lt;A name=9_12&gt;&lt;/A&gt;9.12 Passing Operating System Variables to SQL*Plus&lt;/h3&gt;
&lt;p&gt;You can pass an operating system variable to a SQL*Plus script as a command
  line parameter. For example, on UNIX:&lt;/p&gt;
&lt;PRE&gt;    sqlplus hr/&lt;I&gt;my_password&lt;/I&gt; @myscript.sql $USER

&lt;/PRE&gt;
&lt;p&gt;or in a Windows command window:&lt;/p&gt;
&lt;PRE&gt;    sqlplus hr/&lt;I&gt;my_password&lt;/I&gt; @myscript.sql %USERNAME%
&lt;/PRE&gt;
&lt;p&gt;The script &lt;I&gt;myscript.sql&lt;/I&gt; could reference the substitution variable "&amp;amp;1"
  to see the passed name.&lt;/p&gt;
&lt;h3&gt;&lt;A name=9_13&gt;&lt;/A&gt;9.13 Passing a Value to a PL/SQL Procedure From the Command Line&lt;/h3&gt;
&lt;p&gt;If you create a procedure "myproc":&lt;/p&gt;
&lt;PRE&gt;    create or replace procedure myproc (p1 in number) as
    begin
      dbms_output.put_line('The number is '||p1);
    end;
&lt;/PRE&gt;
&lt;p&gt;and &lt;I&gt;myscript.sql&lt;/I&gt; contains:&lt;/p&gt;
&lt;PRE&gt;    begin
      myproc(&amp;amp;1);
    end;
    /
&lt;/PRE&gt;

&lt;p&gt;then calling:&lt;/p&gt;
&lt;PRE&gt;    sqlplus hr/&lt;I&gt;my_password&lt;/I&gt; @myscript.sql 88
&lt;/PRE&gt;
&lt;p&gt;executes the script as if it is:&lt;/p&gt;
&lt;PRE&gt;    begin
      myproc(88);
    end;
    /
&lt;/PRE&gt;
&lt;p&gt;This method does not work if the parameter "p1" to "myproc" is "IN OUT". The
  variable reference is pre-processed and is effectively a hard coded value which
  cannot contain an OUT value. To get around this you can assign the substitution
  variable to a bind variable. The script &lt;I&gt;myscript.sql&lt;/I&gt; becomes:&lt;/p&gt;
&lt;PRE&gt;    variable mybindvar number
    begin
      :mybindvar := &amp;amp;1;
      myproc(:mybindvar);
    end;
    /
&lt;/PRE&gt;

&lt;h3&gt;&lt;A name=9_14&gt;&lt;/A&gt;9.14 Allowing Script Parameters to be Optional and Have a Default  Value&lt;/h3&gt;
&lt;p&gt;The goal is to create a script which accepts an optional parameter. If a parameter
  is passed from the command line then its value should be used. However, if there
  is no parameter, then SQL*Plus should ask for a value with a customized prompt.&lt;/p&gt;
&lt;p&gt;Perhaps the closest solution is with a PROMPT/DEFINE sequence like this. If
  &lt;I&gt;myscript.sql&lt;/I&gt; is:&lt;/p&gt;
&lt;PRE&gt;    -- Name: myscript.sql
    prompt Enter a value for PAGESIZE
    set termout off
    define mypar = &amp;amp;1
    set termout on

    prompt Setting PAGESIZE to &amp;amp;mypar
    set pagesize &amp;amp;mypar

    select last_name from employees where rownum &amp;lt; 20;
    exit
&lt;/PRE&gt;
&lt;p&gt;you can call the script with or without a parameter. If you enter "12" at the
  prompt your screen looks like:&lt;/p&gt;

&lt;PRE&gt;    % sqlplus hr/&lt;I&gt;my_password&lt;/I&gt; @myscript.sql

    SQL*Plus: Release 9.2.0.3.0 - Production on Wed Mar 5 15:19:40 2003
    ...

    Enter a value for PAGESIZE
    12
    Setting PAGESIZE to 12

    LAST_NAME
    -------------------------
    King
    Kochhar
    De Haan
    ...
&lt;/PRE&gt;
&lt;p&gt;or if you call it with a parameter "8":&lt;/p&gt;
&lt;PRE&gt;    % sqlplus hr/&lt;I&gt;my_password&lt;/I&gt; @myscript.sql 8

    SQL*Plus: Release 9.2.0.3.0 - Production on Wed Mar 5 15:20:38 2003
    ...


    Enter a value for PAGESIZE
    Setting PAGESIZE to 8

    LAST_NAME
    -------------------------
    King
    Kochhar
    De Haan
    ...
&lt;/PRE&gt;
&lt;p&gt;Note when you pass a parameter the PROMPT text is still displayed, but you
  do not enter a value. The PROMPT command is the SQL*Plus "echo" or "print" statement.
  (It does not read input).&lt;/p&gt;
&lt;p&gt;The only occurrence of "&amp;amp;1" should be where "mypar" is defined. All other
  references to the parameter should use "&amp;amp;mypar" or "&amp;amp;&amp;amp;mypar".&lt;/p&gt;
&lt;h3&gt;&lt;A name=9_15&gt;&lt;/A&gt;9.15 Passing a Value to an &lt;I&gt;i&lt;/I&gt;SQL*Plus Dynamic Report for  the Web&lt;/h3&gt;
&lt;p&gt;Variables can be passed as URL parameters to an &lt;I&gt;i&lt;/I&gt;SQL*Plus report. For
  example with &lt;i&gt;i&lt;/i&gt;SQL*Plus 10.1:&lt;/p&gt;

&lt;PRE&gt;
    http://machine/isqlplus/dynamic?script=http://machine/mys.sql&amp;amp;myv=emp&amp;amp;v2=dept
&lt;/PRE&gt;

&lt;p&gt;or in &lt;i&gt;i&lt;/i&gt;SQL*Plus 9i:&lt;/p&gt;

&lt;PRE&gt;
    http://machine/isqlplus?script=http://machine/mys.sql&amp;amp;myv=emp&amp;amp;v2=dept
&lt;/PRE&gt;

&lt;p&gt;These define the substitution variable "&amp;amp;myv" as "emp" and the substitution
  variable "v2" as "dept" before running the script &lt;I&gt;mys.sql&lt;/I&gt;. The script

  can use "&amp;amp;myv" and "&amp;amp;v2" anywhere substitution variables are allowed.&lt;/p&gt;
&lt;p&gt;Note that &lt;I&gt;i&lt;/I&gt;SQL*Plus prompts for a username and password before defining
  the variables and running the script.&lt;/p&gt;
&lt;h3&gt;&lt;A name=9_16&gt;&lt;/A&gt;9.16 Customizing Parameter Prompts for an &lt;I&gt;i&lt;/I&gt;SQL*Plus Dynamic  Report for the Web&lt;/h3&gt;
&lt;p&gt;A customized HTML form can be used to enter and validate variables to be passed
  to an &lt;I&gt;i&lt;/I&gt;SQL*Plus Release 9.2 dynamic report.&lt;/p&gt;
&lt;p&gt;Create and save a SQL*Plus script &lt;I&gt;employee_name.sql&lt;/I&gt; on your Oracle HTTP
  Server. Check it can be loaded into a web browser to verify &lt;I&gt;i&lt;/I&gt;SQL*Plus
  is able to access the file over HTTP. The script is:&lt;/p&gt;
&lt;PRE&gt;    -- Name: employee_name.sql
    set verify off
    set pagesize 200
    set feedback off
    prompt Employee Details for Employee(s) with Last Name like &amp;amp;last_name%
    select *
    from employees
    where upper(last_name) like upper('&amp;amp;last_name%')
    /
&lt;/PRE&gt;
&lt;p&gt;Create an HTML file &lt;I&gt;myreport.html&lt;/I&gt; on your Oracle HTTP Server. The file
  is:&lt;/p&gt;
&lt;PRE&gt;    &amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;

      &amp;lt;title&amp;gt;iSQL*Plus Dynamic Report - Query by Last Name&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
      &amp;lt;h1&amp;gt;iSQL*Plus Dynamic Report - Query by Last Name&amp;lt;/h1&amp;gt;
      &amp;lt;form method=get action="http://machine/isqlplus"&amp;gt;
      &amp;lt;input type="hidden" name="script"
            value="http://machine/employee_name.sql"&amp;gt;
        Enter last name of employee:
        &amp;lt;input type="text" name="last_name" size="20"&amp;gt;
        &amp;lt;input type="submit" value="Run Report"&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&lt;/PRE&gt;
&lt;p&gt;Replace "http://machine/" with the appropriate host name, domain name and port
  number of your Oracle HTTP Server, for example, "http://machine.oracle.com:7777/".
&lt;/p&gt;
&lt;p&gt;The name of the INPUT TYPE should be the same as the substitution variable
  name in the SQL*Plus script. For example, the input field:&lt;/p&gt;
&lt;PRE&gt;    &amp;lt;input type="text" name="last_name" size="20"&amp;gt;
&lt;/PRE&gt;
&lt;p&gt;maps to the substitution variable "&amp;amp;last_name" in &lt;I&gt;employee_name.sql&lt;/I&gt;.&lt;/p&gt;
&lt;p&gt;Load &lt;I&gt;myreport.html&lt;/I&gt; in your web browser. Enter a name or partial name
  in the text field, for example, "Fay". Click the Run Report button. &lt;I&gt;i&lt;/I&gt;SQL*Plus
  will prompt for database connection details and then execute the script. The

  Employee Details report is displayed in your web browser.&lt;/p&gt;
&lt;p&gt;You could add Javascript to the HTML form to do any desired browser-side validation
  of the values entered.&lt;/p&gt;

&lt;h3&gt;&lt;A name=9_17&gt;&lt;/A&gt;9.17 Using a Variable for the SQL*Plus Return Status&lt;/h3&gt;
&lt;p&gt;To use the value of a substitution variable called "myv" as the SQL*Plus return
  status, use:&lt;/p&gt;
&lt;PRE&gt;
    EXIT myv
&lt;/PRE&gt;
&lt;p&gt;No ampersand (&amp;amp;) prefix is required before the substitution variable name.&lt;/p&gt;
&lt;p&gt;A numeric bind variable requires a colon (:) prefix:&lt;/p&gt;
&lt;PRE&gt;    EXIT :mybv&lt;/PRE&gt;

&lt;h3&gt;&lt;A name=9_18&gt;&lt;/A&gt;9.18 Putting the Username and Database in the Prompt&lt;/h3&gt;

&lt;p&gt;In SQL*Plus 10&lt;i&gt;g&lt;/i&gt; add this to your glogin.sql
or login.sql:&lt;/p&gt;

&lt;pre&gt;
    set sqlprompt "_user'@'_connect_identifier:SQL&amp;gt; "
&lt;/pre&gt;

&lt;p&gt;For customized prompts that query the
database make sure to explicitly DEFINE any referenced substitution
variables.  Glogin.sql and login.sql can get run when there is no
database connection.  Defining variables prevents the user being
prompted for values when the query fails and the variables do not get
defined by it: &lt;/p&gt;

&lt;pre&gt;
    set termout off
    define myv = 'Not connected'
    column myc new_value myv
    select user||'@'||global_name myc from global_name;
    set sqlprompt '&amp;amp;myv:SQL&amp;gt; '
    set termout on
&lt;/pre&gt;

&lt;p&gt;SQL*Plus 9.2 and earlier don't re-execute
glogin.sql and login.sql after CONNECT commands.  Also variables in
the SQLPROMPT are not dynamically substituted.  It is possible to use
the query script given above, but beware that the prompt will only be
valid for the original connection.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/7-tHMJ4ZiqI" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/sqlplus_101_substitution_varia</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_11gr2_xe_beta_is_now_av</guid>
    <title>Oracle 11gR2 XE Beta is now available </title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/jLekrI-OBOk/oracle_11gr2_xe_beta_is_now_av</link>
        <pubDate>Fri, 1 Apr 2011 14:17:27 -0500</pubDate>
    <category>php</category>
    <category>database</category>
    <category>express_edition</category>
    <category>lightweight</category>
    <category>php</category>
    <category>release</category>
    <category>small_footprint</category>
    <category>xe</category>
    <atom:summary type="html"> </atom:summary>        <description>&lt;p&gt;Oracle 11gR2 Express Edition ("XE") Beta is now &lt;a
href="http://www.oracle.com/technetwork/database/express-edition/11gxe-beta-download-302519.html"
&gt;downloadable&lt;/a&gt; for Linux x86_64 and Windows (32-Bit).  Oracle XE is
a free, slimmed down version of the full Oracle DB.  Documentation for
XE 11gR2 is &lt;a
href="http://download.oracle.com/docs/cd/E17781_01/index.htm"
&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of the Oracle features retained by XE 11gR2 is &lt;a
href="http://www.oracle.com/technetwork/topics/php/php-scalability-ha-twp-128842.pdf"&gt;DRCP
support&lt;/a&gt;.  This is the first XE release with DRCP so now you can
make the most of limited resources using PHP again a small footprint
DB.&lt;/p&gt;

&lt;p&gt;The big XE change for Linux users is that it is now 64-bit instead
of 32-bit.  With Linux production systems really rooted in a 64-bit
world it makes sense for XE to head in that direction too.&lt;/p&gt;

&lt;p&gt;Report any XE 11gR2 Beta issues at the &lt;a
href="http://forums.oracle.com/forums/forum.jspa?forumID=1378"
&gt;dedicated OTN forum&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;To compile PHP with XE 11gR2 Beta code, edit
&lt;code&gt;$ORACLE_HOME/lib/sysliblist&lt;/code&gt; and remove the references to
the two libraries &lt;code&gt;-lipgo -lsvml&lt;/code&gt; (Oracle bug 12318656).
Before the Beta release I had picked up on another compilation gotcha but didn't
spot this sysliblist issue.  Dang.  Luckily, that's what Beta programs
are for!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/jLekrI-OBOk" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_11gr2_xe_beta_is_now_av</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/cx_oracle_51_for_python_is_ava</guid>
    <title>cx_Oracle 5.1 for Python is Available</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/gK3jcwc_9_E/cx_oracle_51_for_python_is_ava</link>
        <pubDate>Tue, 29 Mar 2011 19:21:52 -0500</pubDate>
    <category>python</category>
    <category>cx_oracle</category>
    <category>python</category>
    <category>release</category>
    <atom:summary type="html"> </atom:summary>        <description>Anthony Tuininga has released  the cx_Oracle 5.1 extension for Python.  His announcement email has the details: &lt;a href="http://mail.python.org/pipermail/python-announce-list/2011-March/008876.html"&gt;http://mail.python.org/pipermail/python-announce-list/2011-March/008876.html&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/gK3jcwc_9_E" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/cx_oracle_51_for_python_is_ava</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/building_php_53_with_oracle_ht</guid>
    <title>Building PHP 5.3 with Oracle HTTP Server 11g</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/RULfbuRjzPc/building_php_53_with_oracle_ht</link>
        <pubDate>Wed, 23 Mar 2011 11:13:24 -0500</pubDate>
    <category>php</category>
    <category>11g</category>
    <category>http</category>
    <category>installation</category>
    <category>ohs</category>
    <category>oracle</category>
    <category>php</category>
    <category>server</category>
    <atom:summary type="html"> </atom:summary>        <description>&lt;p&gt;This post has instructions for building PHP with Oracle HTTP Server
11g (OHS).  It is based on the older note &lt;a
href="http://www.oracle.com/technetwork/topics/php/php-ohs-092324.html"
&gt;Using PHP with Oracle HTTP Server 11g&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;I used an uncommon OS, but the instructions should be very similar
for other systems.  This post is in the "blogging it so I can find it
again" category.&lt;/p&gt;

&lt;p&gt;I recently had the so-called "pleasure" of building PHP on HP/UX
Itanium.  This is a platform that I'm very glad to see Oracle's
announcement: &lt;a
href="http://www.oracle.com/us/corporate/press/346696" &gt;Oracle Stops
All Software Development For Intel Itanium Microprocessor&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I get the impression that not a lot of people in the PHP community
are using Itanium.  There are enough warnings during PHP compilation
that would make me extremely uncomfortable using it for production
applications.  A PHP on Itanium installation bug that I logged long
ago has not been patched, indicating to me that not many PHP people
are investing time in the platform.  I can't recommend using Itanium
platform for PHP.  &lt;/p&gt;

&lt;p&gt;Anyway, I had a need and here are the steps for posterity.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Steps to build PHP 5.3.5 with OHS 11g (with reference to HP/UX Itanium 64 bit)&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;1. Check OS &amp; compiler&lt;/p&gt;

&lt;pre&gt;
    $ uname -a
    HP-UX B.11.31 U ia64 2921109885 unlimited-user license

    $ cc --version
    cc: HP C/aC++ B3910B A.06.23 [May 18, 2009]
&lt;/pre&gt;

&lt;p&gt;    I saw various issues with the whole HP/UX build environment,
    including total compilation failure when using an older
    (different??) compiler than this.
&lt;/p&gt;

&lt;p&gt;2a. Set the Oracle environment.  The Oracle home contains an instance
   of OHS.&lt;/p&gt;
&lt;pre&gt;
     export ORACLE_HOME=/path/to/your/oracle-home
     export ORACLE_INSTANCE=$ORACLE_HOME/instances/instance1

     export CONFIG_FILE_PATH=$ORACLE_INSTANCE/config/OHS/ohs1
     export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/ohs/lib:$LD_LIBRARY_PATH
&lt;/pre&gt;

&lt;p&gt;2b. Set the PHP compiler environment.  &lt;/p&gt;
&lt;pre&gt;
     export CFLAGS='+O2 +DD64'
     export CC=/bin/cc
&lt;/pre&gt;

&lt;p&gt;   You'll need to check and experiement with the best compiler
   options.  On Itanium +DD64 is needed to create a 64bit binary
   usable with OHS.
&lt;/p&gt;

&lt;p&gt;3. Download and extract the Oracle InstantClient 11.1.0.7.0 SDK ZIP file from
   &lt;a href="http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html" &gt;http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html&lt;/a&gt;
   e.g.: &lt;a href="http://download.oracle.com/otn/hp/instantclient/111070/sdk-11.1.0.7.0-hpux-ia64.zip" &gt;http://download.oracle.com/otn/hp/instantclient/111070/sdk-11.1.0.7.0-hpux-ia64.zip&lt;/a&gt;
&lt;/p&gt;
&lt;pre&gt;
     unzip sdk-11.1.0.7.0-hpux-ia64.zip
&lt;/pre&gt;

&lt;p&gt;4. Copy the new header files&lt;/p&gt;
&lt;pre&gt;
     cp instantclient_11_1/sdk/include/*.h $ORACLE_HOME/rdbms/demo
&lt;/pre&gt;

&lt;p&gt;5. Extract the php-5.3.5 bundle to a working directory:&lt;/p&gt;

&lt;pre&gt;
     gunzip php-5.3.5.tar.gz
     tar -xf php-5.3.5.tar
&lt;/pre&gt;

&lt;p&gt;6. Change to the extracted PHP directory:&lt;/p&gt;
&lt;pre&gt;
     cd php-5.3.5
&lt;/pre&gt;

&lt;p&gt;7. Edit PHP's 'configure' and change 'sl' to 'so' in the 'hpux' case
   at about line 3720: (This is the Itanium specific part of the patch in
   &lt;a href="http://pecl.php.net/bugs/bug.php?id=15016" &gt;PHP PECL Bug 15016&lt;/a&gt;)
&lt;/p&gt;

&lt;pre&gt;
     case $host_alias in
     *hpux*)
       SHLIB_SUFFIX_NAME=so
       SHLIB_DL_SUFFIX_NAME=so
       ;;
&lt;/pre&gt;

&lt;p&gt;8. If using PHP 5.3.6 or earlier, edit PHP's 'configure' script and
   change both occurrences of:
&lt;/p&gt;

&lt;pre&gt;
      APACHE_VERSION=`expr $4 \* 1000000 + $5 \* 1000 + $6`
&lt;/pre&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;pre&gt;
      APACHE_VERSION=`expr $6 \* 1000000 + $7 \* 1000 + $8`
&lt;/pre&gt;

&lt;p&gt;This step is missing from the OHS 11g PHP installation
   instructions. It is needed because OHS's Apache reports its error
   number differently.  See &lt;a
   href="http://bugs.php.net/bug.php?id=54084" &gt;PHP bug 54084&lt;/a&gt;,
   which I just fixed in the 5.3 and trunk branches of the PHP source
   code.&lt;/p&gt;

&lt;p&gt;9. Clean up if you are repeating the steps and re-running 'configure'
   with different options:&lt;/p&gt;
&lt;pre&gt;
      make distclean
      rm -rf config.cache autom4te.cache
&lt;/pre&gt;

&lt;p&gt;10. Configure &amp; build PHP with whatever options:&lt;/p&gt;
&lt;pre&gt;
      ./configure --disable-all --with-apxs2=$ORACLE_HOME/ohs/bin/apxs \
                  --with-oci8=$ORACLE_HOME --disable-rpath \
                  --prefix=$ORACLE_HOME --with-config-file-path=$CONFIG_FILE_PATH
      make
&lt;/pre&gt;

&lt;p&gt;    This produces a bunch of compiler warnings that would make me very
    uncomfortable to have running in production.
&lt;/p&gt;

&lt;p&gt;Notice I used --disable-all.  The system libraries are a little
different on Itanium and I didn't have access to libraries such as
libxml2.  Perhaps by working out the installation steps or by building
third-party software bundles you could get the dependencies for other
PHP extensions.&lt;/p&gt;

&lt;p&gt;11. Copy a default php.ini file:&lt;/p&gt;

&lt;pre&gt;      cp php.ini-devlopment $CONFIG_FILE_PATH/php.ini
&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;
      cp php.ini-production $CONFIG_FILE_PATH/php.ini
&lt;/pre&gt;

&lt;p&gt;12. Edit $CONFIG_FILE_PATH/php.ini and add a timezone line (this is
    mandatory for PHP 5.3):&lt;/p&gt;
&lt;pre&gt;
      date.timezone=America/Los_Angeles
&lt;/pre&gt;

&lt;p&gt;13. Edit $CONFIG_FILE_PATH/php.ini and add 'E' to 'variables_order' so
    PHP's run-tests.php passes the Oracle environment correctly when
    running tests:&lt;/p&gt;
&lt;pre&gt;
      variables_order = "EGPCS"
&lt;/pre&gt;

&lt;p&gt;    This can be removed later.&lt;/p&gt;

&lt;p&gt;14. Modify run-tests.php and change 60 to 600.  This prevents long
    Oracle tests from timing out.&lt;/p&gt;

&lt;p&gt;15. Edit ext/oci8/tests/details.inc and set the SYSTEM password and
    connection string to your Oracle DB.&lt;/p&gt;

&lt;p&gt;16. Set the PHP environment so PHP tests don't try to email results to
    the world:&lt;/p&gt;
&lt;pre&gt;
      export NO_INTERACTION=no
&lt;/pre&gt;

&lt;p&gt;17. Test the PHP command-line binary:&lt;/p&gt;
&lt;pre&gt;
      make test
&lt;/pre&gt;
&lt;p&gt;    The OCI8 tests can be run with:&lt;/p&gt;
&lt;pre&gt;
      make test TESTS=ext/oci8
&lt;/pre&gt;

&lt;p&gt;18. Investigate failed tests.  Also compare the results with 64 bit
    Linux results.  A significant number of tests do pass on Itanium,
    which gives some hope that much of the PHP code base works, even
    if it is delicate and likely to be prone to memory corruption
    issues.
&lt;/p&gt;
&lt;p&gt;19. If all is OK, install the PHP binaries:&lt;/p&gt;
&lt;pre&gt;
      make install
&lt;/pre&gt;

&lt;p&gt;20. Edit $CONFIG_FILE_PATH/httpd.conf and add a line:&lt;/p&gt;
&lt;pre&gt;
     AddType application/x-httpd-php .php 
&lt;/pre&gt;

&lt;p&gt;21. Restart OHS:&lt;/p&gt;
&lt;pre&gt;
     cd $ORACLE_INSTANCE/bin
     ./opmnctl start
     ./opmnctl stopproc ias-component=ohs1
     ./opmnctl startproc ias-component=ohs1
&lt;/pre&gt;

&lt;p&gt;22. Create a phpinfo file:&lt;/p&gt;
&lt;pre&gt;
      echo '&amp;lt;?php phpinfo(); ?&amp;gt;' &amp;gt; $ORACLE_INSTANCE/config/OHS/ohs1/htdocs/phpinfo.php
&lt;/pre&gt;

&lt;p&gt;23. Check phpinfo on the port OHS is configured for.  In my case it
    was port 7777:
&lt;/p&gt;
&lt;pre&gt;
      http://localhost:7777/phpinfo.php
&lt;/pre&gt;

&lt;p&gt;24. Create and run some OCI8 scripts in $ORACLE_INSTANCE/config/OHS/ohs1/htdocs at your leisure.
&lt;/p&gt;

&lt;p&gt;To repeat my earlier warning, I don't recommend using PHP on Itanium.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/RULfbuRjzPc" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/building_php_53_with_oracle_ht</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/netretails_online_retail_opera</guid>
    <title>Netretail's online retail operation benefits from personal contact</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/Bgzy1WmrZUs/netretails_online_retail_opera</link>
        <pubDate>Wed, 16 Mar 2011 14:11:56 -0500</pubDate>
    <category>php</category>
    <category>connection_pooling</category>
    <category>customer_profile</category>
    <category>drcp</category>
    <category>netretail</category>
    <category>online</category>
    <category>php</category>
    <category>retail</category>
    <category>web_application</category>
    <atom:summary type="html"> </atom:summary>        <description>&lt;p&gt;Hot on oracle.com is a &lt;a
href="http://www.oracle.com/us/corporate/customers/netretail-holding-1-db-snapshot-307054.pdf"&gt;snapshot
of Netretail Holding B.V.&lt;/a&gt; profiling their use of PHP and Oracle
technology such as Oracle RAC cluster database to become a leading
online retailer across Central and Eastern Europe.&lt;/p&gt;

&lt;p&gt;We've also just refreshed our key &lt;a
href="http://www.oracle.com/technetwork/topics/php/whatsnew/php-scalability-ha-twp-128842.pdf"
&gt;PHP Scalability and High Availability &lt;/a&gt; whitepaper which talks
about connection pooling (DRCP) and Fast Application Notification
(FAN).  We brought it up to date for 11gR2 and PHP 5.3.  It now
includes the new 11gR2 V$CPOOL_CONN_INFO view, the new columns for
DBA_CPOOL_INFO, information about LOGOFF triggers, and information
about the support for Client Result Caching with DRCP.&lt;/p&gt;

&lt;p&gt;Back to Netretail.  Two of their secrets to success are keeping
technically up to date, and networking.  That is, networking in the
business sense.  I had the pleasure of meeting Michal Táborský (&lt;a
href="http://www.twitter.com/whizz"&gt;@whizz&lt;/a&gt;), the Chief System
Architect, when he was in California for a Velocity conference.
Michal took time to visit Oracle HQ and talk with our developers about
his then current architecture and future needs.  I also met his
manager at last year's Oracle OpenWorld conference.&lt;/p&gt;

&lt;p&gt;Having built up a relationship with us, Netretail now has access to
Oracle Development staff.  While this will never bypass Oracle Support
(which have tools, systems etc that are needed and useful for
resolving issues), it makes communication easier for some classes of
questions. It helps discussions that will let us improve Oracle
products, and make Netretail stronger.&lt;/p&gt;

&lt;p&gt;I like this.  And there's no reason why you can't talk with us
too. You know where to &lt;a href="mailto:christopher.jones@oracle.com" &gt;email
me&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/Bgzy1WmrZUs" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/netretails_online_retail_opera</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/more_on_php_and_oracle_11gr2_i</guid>
    <title>More on PHP and Oracle 11gR2 Improvements to Client Result Caching</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/HfvVUi0uKcU/more_on_php_and_oracle_11gr2_i</link>
        <pubDate>Thu, 3 Mar 2011 12:36:33 -0600</pubDate>
    <category>php</category>
    <category>benchmark</category>
    <category>cache</category>
    <category>client</category>
    <category>crc</category>
    <category>php</category>
    <category>result</category>
    <atom:summary type="html"> </atom:summary>        <description>&lt;p&gt;Oracle 11.2 brought several improvements to Client Result Caching.  CRC is way for the results of queries to be cached in the database client process for reuse.&amp;nbsp; In an Oracle OpenWorld presentation "&lt;a href="http://www.oracle.com/technetwork/database/enterprise-edition/databaseaccessperformancebest.pdf"&gt;Best Practices for Developing Performant Application&lt;/a&gt;" my colleague Luxi Chidambaran had a (non-PHP generated) graph for the Nile benchmark that shows a DB CPU reduction up to 600% and response times up to 22% faster when using CRC.&lt;/p&gt;&lt;p&gt;Sometimes CRC is called the "Consistent Client Cache" because Oracle automatically invalidates the cache if table data is changed.&amp;nbsp; This makes it easy to use without needing application logic rewrites.  There are a few simple database settings to turn on and tune CRC, so management is also easy.&lt;/p&gt;&lt;p&gt;PHP OCI8 as a "client" of the database can use CRC.&amp;nbsp; The cache is per-process, so plan carefully before caching large data sets.&amp;nbsp; Tables that are candidates for caching are look-up tables where the network transfer cost dominates.&lt;/p&gt;&lt;p&gt;CRC is really easy in 11.2 - I'll get to that in a moment.&amp;nbsp; It was also pretty easy in Oracle 11.1 but it needed some tiny application changes.&amp;nbsp; In PHP it was used like:&lt;/p&gt;&lt;p&gt;&lt;font face="monospace"&gt;$s = oci_parse($c, "select /*+ result_cache */ * from employees");&lt;br/&gt;
oci_execute($s, OCI_NO_AUTO_COMMIT); // Use OCI_DEFAULT in OCI8 &amp;lt;= 1.3&lt;br/&gt;
oci_fetch_all($s, $res);&lt;/font&gt;&lt;/p&gt;&lt;p&gt;I &lt;a href="https://blogs.oracle.com/opal/entry/oracle_11g_result_caching_and"&gt;blogged about this&lt;/a&gt; in the past.&amp;nbsp; The query had to include a specific hint that you wanted the results cached, and you needed to turn off auto committing during execution either with the OCI_DEFAULT flag or its new, better-named alias OCI_NO_AUTO_COMMIT.&amp;nbsp; The no-commit flag rule didn't seem reasonable to me because most people wouldn't be specific about the commit state for a query.&lt;/p&gt;&lt;p&gt;Now in Oracle 11.2, DBAs can now nominate tables for caching, either with CREATE TABLE or ALTER TABLE.&amp;nbsp; That means you don't need the query hint anymore.&amp;nbsp; As well, the no-commit flag requirement has been lifted.&amp;nbsp; Your code can now look like:&lt;/p&gt;&lt;p&gt;&lt;font face="monospace"&gt;$s = oci_parse($c, "select * from employees");&lt;br/&gt;
oci_execute($s);&lt;br/&gt;
oci_fetch_all($s, $res);&lt;/font&gt;&lt;/p&gt;&lt;p&gt;Since your code probably already looks like this, your DBA can find the top queries in the database and simply tune the system by turning on CRC in the database and issuing an ALTER TABLE statement for candidate tables.&amp;nbsp; Voila.&lt;/p&gt;&lt;p&gt;Another CRC improvement in Oracle 11.2 is that it works with DRCP connection pooling.&lt;/p&gt;&lt;p&gt;There is some fine print about what is and isn't cached, check the &lt;a href="http://www.oracle.com/pls/db112/homepage"&gt;Oracle manuals&lt;/a&gt; for details.&amp;nbsp; If you're using 11.1 or non-DRCP "dedicated servers" then make sure you use oci_pconnect() persistent connections.&amp;nbsp; Also in PHP don't bind strings in the query, although binding as SQLT_INT is OK.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/HfvVUi0uKcU" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/more_on_php_and_oracle_11gr2_i</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/profiling_netbeans_70_beta_2_a_1</guid>
    <title>Profiling NetBeans 7.0 Beta 2 and Reporting Problems</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/1W4zrBqjudw/profiling_netbeans_70_beta_2_a_1</link>
        <pubDate>Tue, 1 Mar 2011 13:12:10 -0600</pubDate>
    <category>php</category>
    <category>php</category>
    <atom:summary type="html"> </atom:summary>        <description>&lt;p&gt;&lt;p&gt;With NetBeans 7.0 recently going into Beta 2 phase, now is the time to test it out properly and report issues.  The development team has been squashing bugs, including memory issues with the PHP bundle.&lt;/p&gt;&lt;p&gt;There are some great &lt;a href="http://netbeans.org/community/releases/70/index.html"&gt;new PHP related features&lt;/a&gt; in NetBeans 7.0, so you know you want to try it out.&lt;/p&gt;&lt;p&gt;If you identify something wrong with NetBeans, please report it following the guidelines &lt;a href="http://wiki.netbeans.org/IssueReportingGuidelines"&gt;http://wiki.netbeans.org/IssueReportingGuidelines&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Depending on the issues, data to attach to the report is mentioned on: &lt;a href="http://wiki.netbeans.org/FaqLogMessagesFile"&gt;http://wiki.netbeans.org/FaqLogMessagesFile&lt;/a&gt; and &lt;a href="http://wiki.netbeans.org/FaqProfileMeNow"&gt; http://wiki.netbeans.org/FaqProfileMeNow&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you have a memory issue then a memory dump would also be useful. Run the &lt;tt&gt;jmap&lt;/tt&gt; tool for this. There is some background information on &lt;a href="http://wiki.netbeans.org/FaqMemoryDump"&gt;http://wiki.netbeans.org/FaqMemoryDump&lt;/a&gt;.  Here's how I used it.&lt;/p&gt;&lt;p&gt;First I set my environment to match the JDK used by NetBeans.  In my case I am using a nightly build so the JDK is in the configuration file under &lt;tt&gt;$HOME/netbeans-dev-201102210501&lt;/tt&gt;:&lt;/p&gt;&lt;pre&gt;$ egrep netbeans_jdkhome $HOME/netbeans-dev-201102210501/etc/netbeans.conf&lt;br/&gt;
netbeans_jdkhome="/home/cjones/src/jdk1.6.0_24"&lt;br/&gt;
$ export JAVA_HOME=/home/cjones/src/jdk1.6.0_24&lt;br/&gt;
$ export PATH=$JAVA_HOME/bin:$PATH&lt;br/&gt;
&lt;/pre&gt;&lt;p&gt;Next, I found the correct process number to examine:&lt;/p&gt;&lt;p&gt;&lt;font face="monospace"&gt;$ ps -ef | egrep 'netbeans|jdk'&lt;br /&gt;cjones&amp;nbsp;&amp;nbsp; 23230&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp; 0 16:07 ?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00:00:00 /bin/bash /home/cjones/netbeans-&lt;br /&gt;cjones&amp;nbsp;&amp;nbsp; 23438 23230&amp;nbsp; 2 16:07 ?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00:00:09 /home/cjones/src/jdk1.6.0_24/bin&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Finally I used the parent JDK process as the &lt;tt&gt;jmap&lt;/tt&gt; argument:&lt;br /&gt;&lt;/p&gt;&lt;font face="monospace"&gt;$ jmap -histo:live 23438&lt;br /&gt;&amp;nbsp;num&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #instances&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #bytes&amp;nbsp; class name&lt;br /&gt;----------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp; 1:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12075&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9028656&amp;nbsp; [I&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 49535&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6581920&amp;nbsp; &amp;lt;constmethodklass&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 3:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 49535&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3964128&amp;nbsp; &amp;lt;methodklass&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 4:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 80256&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3840776&amp;nbsp; &amp;lt;symbolklass&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 5:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 36093&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3635336&amp;nbsp; [C&lt;br /&gt;&amp;nbsp;&amp;nbsp; 6:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5095&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3341312&amp;nbsp; &amp;lt;constantpoolklass&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 7:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5095&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2486016&amp;nbsp; &amp;lt;instanceklassklass&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 8:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4325&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1961432&amp;nbsp; &amp;lt;constantpoolcacheklass&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 9:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18729&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1763976&amp;nbsp; [B&lt;br /&gt;&amp;nbsp; 10:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 59952&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1438848&amp;nbsp; java.util.HashMap$Entry&lt;br /&gt;&amp;nbsp; . . .&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;This histogram memory report will help identify the kind of memory issues you are seeing.  It may not be as complete as an often tens of megabyte &lt;tt&gt;jmap -dump:live,file=/tmp/nbheap.log 23438&lt;/tt&gt; heap dump, but is much more easily attached to a bug report.&lt;p&gt;If you want to keep up to date with NetBeans, nightly builds are at:&amp;nbsp;&lt;a href="http://bits.netbeans.org/download/trunk/nightly/latest/zip/"&gt;http://bits.netbeans.org/download/trunk/nightly/latest/zip/&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/1W4zrBqjudw" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/profiling_netbeans_70_beta_2_a_1</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_oci8_and_oracle_11g_drcp_c</guid>
    <title>PHP OCI8 and Oracle 11g DRCP Connection Pooling in Pictures</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/s9DrDBew_LE/php_oci8_and_oracle_11g_drcp_c</link>
        <pubDate>Mon, 21 Feb 2011 16:32:28 -0600</pubDate>
    <category>php</category>
    <category>11g</category>
    <category>connection</category>
    <category>database</category>
    <category>dedicated</category>
    <category>drcp</category>
    <category>example</category>
    <category>graph</category>
    <category>oci8</category>
    <category>oracle</category>
    <category>php</category>
    <category>pool</category>
    <category>pooled</category>
    <atom:summary type="html"> </atom:summary>        <description>&lt;p&gt;Here is a screen shot from a PHP OCI8 connection pooling demo that I
like to run. It graphically shows how little database host memory is
needed when using DRCP connection pooling with Oracle Database 11g.
&lt;/p&gt;

&lt;p&gt;Migrating to DRCP can be as simple as starting the pool and
changing the connection string in your PHP application.&lt;/p&gt;

&lt;p&gt;The script that generated the data for this graph was a simple
"Parts" query application being run under various simulated user
loads.  I was running the database on a small Oracle Linux server with
just 2G of memory.  I used PHP OCI8 1.4.  Apache is in pre-fork mode,
as needed for PHP.&lt;/p&gt;

&lt;p&gt;Each graph has time on the horizontal access in arbitrary 'tick'
time units.&lt;/p&gt;
&lt;form mt:asset-id="13276" class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="https://blogs.oracle.com/opal/resource/assets_c-2011-02/drcp_results-13276.html" onclick="window.open('https://blogs.oracle.com/opal/resource/assets_c-2011-02/drcp_results-13276.html','popup','width=1048,height=760,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;&lt;img src="https://blogs.oracle.com/opal/resource/drcp_results.png" width="600" height="435" alt="Graphs comparing Oracle DRCP pooled with 'dedicated server' usage" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/a&gt;&lt;/form&gt;

&lt;p&gt;Click the image to see it full sized.&lt;/p&gt;

&lt;b&gt;Pooled connections&lt;/b&gt;

&lt;p&gt;Beginning with the top left graph, At tick time 65 I used Apache's
'&lt;i&gt;ab&lt;/i&gt;' tool to start 100 concurrent 'users' running the
application.  These users connected to the database using DRCP:&lt;/p&gt;

&lt;pre&gt;
    $c = oci_pconnect('phpdemo', 'welcome', 'myhost/orcl:pooled');
&lt;/pre&gt;

&lt;p&gt;A second hundred DRCP users were added to the system at tick 80 and
a final hundred users added at tick 100.  At about tick 110 I stopped
the test and restarted Apache.  This closed all the connections.&lt;/p&gt;

&lt;p&gt;The bottom left graph shows the number of statements being executed
by the database per second, with some spikes for background database
activity and some variability for this small test.  Each extra batch of
users adds another 'step' of load to the system.&lt;/p&gt;

&lt;p&gt;Looking at the top right Server Process graph shows the database
server processes doing the query work for each web user.  As user load
is added, the DRCP server pool increases (in green).  The pool is
initially at its default size 4 and quickly ramps up to about (I'm
guessing) 35.  At tick time 100 the pool increases to my configured
maximum of 40 processes.  Those 40 processes are doing the query work
for all 300 web users.  When I stopped the test at tick 110, the
pooled processes remained open waiting for more users to connect.  If
I had left the test quiet for the DRCP '&lt;i&gt;inactivity_timeout&lt;/i&gt;'
period (300 seconds by default), the pool would have shrunk back to 4
processes.  &lt;/p&gt;

&lt;p&gt;Looking at the bottom right, you can see the amount of memory being
consumed by the database.  During the initial quiet period about 500M
of memory was in use.  The absolute number is just an indication of my
particular DB configuration.  As the number of pooled processes
increases, each process needs more memory.  You can see the shape of
the memory graph echoes the Server Process graph above it.  Each of
the 300 web users will also need a few kilobytes but this is almost
too small to see on the graph.&lt;/p&gt;

&lt;b&gt;Non-pooled connections&lt;/b&gt;

&lt;p&gt;Compare the DRCP case with using '&lt;i&gt;dedicated server&lt;/i&gt;'
processes.&lt;/p&gt;

&lt;p&gt;At tick 140 I started 100 web users who did &lt;b&gt;not&lt;/b&gt; use pooled
connections:&lt;/p&gt;

&lt;pre&gt;
    $c = oci_pconnect('phpdemo', 'welcome', 'myhost/orcl');
&lt;/pre&gt;

&lt;p&gt;This connection string change is the only difference between the two
tests.&lt;/p&gt;

&lt;p&gt;At ticks 155 and 165 I started two more batches of 100 simulated
users each. At about tick 195 I stopped the user load but left Apache
running.  Apache then gradually returned to its quiescent state,
killing idle httpd processes and producing the downward slope at the
right of the graphs as the persistent database connection in each
Apache process was closed.&lt;/p&gt;

&lt;p&gt;The Executions per Second graph on the bottom left shows the same
step increases as for the earlier DRCP case.  The database is handling
this load.&lt;/p&gt;

&lt;p&gt;But look at the number of Server processes on the top right graph.
There is now a one-to-one correspondence between Apache/PHP processes
and DB server processes. Each PHP processes has one DB server
processes dedicated to it.  Hence the term '&lt;i&gt;dedicated server&lt;/i&gt;'.
&lt;/p&gt;

&lt;p&gt;The memory required on the database is proportional to all those
database server processes started. Almost all my system's memory was
consumed. I doubt it would have coped with any more user load.&lt;/p&gt;

&lt;b&gt;Summary&lt;/b&gt;

&lt;p&gt;Oracle Database 11g DRCP connection pooling significantly reduces
database host memory requirements allow more system memory to be
allocated for the SGA and allowing the system to scale to handled
thousands of concurrent PHP users.&lt;/p&gt;

&lt;p&gt;Even for small systems, using DRCP allows more web users to be
active.&lt;/p&gt;

&lt;p&gt;More information about PHP and DRCP can be found in the &lt;i&gt;PHP
Scalability and High Availability&lt;/i&gt; chapter of &lt;a
href="http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html"&gt;The
Underground PHP and Oracle Manual&lt;/a&gt;. &lt;b&gt;Update&lt;/b&gt;: the &lt;a href="http://www.oracle.com/technetwork/topics/php/whatsnew/php-scalability-ha-twp-128842.pdf"&gt;whitepaper&lt;/a&gt; that the chapter was based on shows a benchmark where we supported 20,000 users on a database using commodity hardware with 2G memory.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/s9DrDBew_LE" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_oci8_and_oracle_11g_drcp_c</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/learn_to_use_php_or_python_wit</guid>
    <title>Learn to use PHP and Python with Oracle Database</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/qqAD9xrmqH8/learn_to_use_php_or_python_wit</link>
        <pubDate>Wed, 15 Dec 2010 20:25:38 -0600</pubDate>
    <category>php</category>
    <category>OBE</category>
    <category>database</category>
    <category>php</category>
    <category>python</category>
    <category>training</category>
    <atom:summary type="html"> </atom:summary>        <description>&lt;p&gt;The &lt;a href="http://apex.oracle.com/pls/apex/f?p=9830:1:0"
&gt;Oracle Learning Library&lt;/a&gt; has posted up the latest "Oracle By
Example" labs giving an introduction to PHP &amp;amp; Python with the Oracle Database :

&lt;ul&gt;

&lt;li&gt;&lt;a href="http://st-curriculum.oracle.com/obe/db/11g/r2/prod/appdev/opensrclang/phphol2010_db/php_db.htm" &gt;Using PHP with Oracle Database 11g&lt;/a&gt; - a basic introduction
&lt;li&gt;
&lt;a href="http://st-curriculum.oracle.com/obe/db/11g/r2/prod/appdev/opensrclang/phphol2010_webapp/php_webapp.htm" &gt;Developing a PHP Web Application with Oracle Database 11g &lt;/a&gt; - a Zend Framework application using the NetBeans IDE
&lt;li&gt;&lt;a href="http://st-curriculum.oracle.com/obe/db/11g/r2/prod/appdev/opensrclang/pythonhol2010_db/python_db.htm" &gt;Using Python With Oracle Database 11g&lt;/a&gt; - a basic introduction 
&lt;li&gt;&lt;a href="http://st-curriculum.oracle.com/obe/db/11g/r2/prod/appdev/opensrclang/pythonhol2010_django/python_django.htm" &gt;Using the Django Framework with Python and Oracle Database 11g&lt;/a&gt; - a basic web application&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/qqAD9xrmqH8" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/learn_to_use_php_or_python_wit</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_oci8_145_is_on_pecl</guid>
    <title>PHP OCI8 1.4.5 is on PECL</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/lDFA_L8YJVk/php_oci8_145_is_on_pecl</link>
        <pubDate>Thu, 9 Dec 2010 20:37:59 -0600</pubDate>
    <category>php</category>
    <category>driver</category>
    <category>oci8</category>
    <category>patch</category>
    <category>php</category>
    <category>release</category>
    <category>security</category>
    <atom:summary type="html"> </atom:summary>        <description>I just released &lt;a
href="http://pecl.php.net/package-info.php?package=oci8&amp;version=1.4.5"&gt;OCI8
1.4.5&lt;/a&gt; on PECL.  It is the same code base included in &lt;a
href="http://www.php.net/archive/2010.php#id2010-12-10-1" &gt;PHP
5.3.4&lt;/a&gt;.  It can be used to upgrade OCI8 on older PHP releases. OCI8
1.4.5 has one change since OCI8 1.4.4 made as part of PHP-wide
security fix to disallow null bytes in filenames.&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/lDFA_L8YJVk" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_oci8_145_is_on_pecl</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/fast_in-memory_caching_with_jr</guid>
    <title>Fast In-Memory Caching with JRuby &amp; Jython Using Oracle Coherence</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/su6JP8s6U5A/fast_in-memory_caching_with_jr</link>
        <pubDate>Mon, 6 Dec 2010 10:27:24 -0600</pubDate>
    <category>python</category>
    <category>cache</category>
    <category>coherence</category>
    <category>jruby</category>
    <category>jython</category>
    <atom:summary type="html"> </atom:summary>        <description>My Aussie colleage Pas Apicella has been evaluating JRuby &amp; Jython.
One test was using them to access &lt;a
href="http://www.oracle.com/technetwork/middleware/coherence/overview/index.html"&gt;Oracle
Coherence&lt;/a&gt;, a "replicated and distributed (partitioned) data
management and caching services on top of a reliable, highly scalable
peer-to-peer clustering protocol.". He blogged and shows code samples
&lt;a
href="http://theblasfrompas.blogspot.com/2010/12/access-coherence-cache-from-jythonjruby.html"
&gt;here&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/su6JP8s6U5A" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/fast_in-memory_caching_with_jr</feedburner:origLink></item>
  </channel>
</rss>

