Easy PL/SQL Upgrades With Edition Based Redefinition
create table myemp (name varchar2(10), hoursworked number);
insert into myemp (name, hoursworked) values ('alison', 200);
insert into myemp (name, hoursworked) values ('kris',   200);
insert into myemp (name, hoursworked) values ('wenji',  200);
commit;
create or replace function vacationdaysleft(p_name in varchar2) return number as
vdl number;
begin
-- For every 40 hours worked, you get 1 day of vacation
select floor(hoursworked / 40) into vdl
from myemp
where myemp.name = p_name;
return vdl;
end;
/
Test the function in SQL*Plus by calling it:
SQL> select name, vacationdaysleft(name) from myemp;
This returns:
NAME                           VACATIONDAYSLEFT(NAME)
------------------------------ ----------------------
alison                                              5
kris                                                5
wenji                                               5
In PHP the function might be used like:
Script 95: edition1.php
<?php
oci_set_edition('ora$base');
$c = oci_connect('hr', 'welcome', 'localhost/XE');
$s = oci_parse($c, "begin :vdl := vacationdaysleft(:name); end;");
oci_bind_by_name($s, ":vdl", $vdl, 10);
oci_bind_by_name($s, ":name", $name, 10);
$name = 'alison';
oci_execute($s);
echo "$name has ".$vdl." days vacation left\n";
?>
This makes a simple call to the stored function and returns the number of vacation days 
person $name has.
The ora$base token in oci_set_edition() means to use the root or first edition of objects, 
i.e the PL/SQL function we just created. Although currently redundant because it sets the 
default edition, the edition name will be changed in the next version of this file to change the 
version of the vacationdaysleft() procedure being called. Instead of calling 
227
Pdf add signature field - C# PDF Field Edit Library: insert, delete, update pdf form field in C#.net, ASP.NET, MVC, Ajax, WPF
Online C# Tutorial to Insert, Delete and Update Fields in PDF Document
create pdf form; adding signature to pdf form
Pdf add signature field - VB.NET PDF Field Edit library: insert, delete, update pdf form field in vb.net, ASP.NET, MVC, Ajax, WPF
How to Insert, Delete and Update Fields in PDF Document with VB.NET Demo Code
adding text fields to pdf acrobat; adding form fields to pdf files
Using PL/SQL With OCI8
oci_set_edition() you could alternatively assign an edition to an Oracle Net service with the 
DBMS_SERVICE PL/SQL procedure and set the PHP connection string to that service..
A DBA can query DBA_EDITIONS to see what editions are available in the database. An 
application user can query select sys_context('USERENV', 'CURRENT_EDITION_NAME') from 
dual to see the edition they are currently accessing.
The script edition1.php produces output like:
alison has 5 days vacation left
This is good. We can put the application into production and employees can start using it.
Now assume the rate used to calculate vacation hours needs to be changed so that for 
every 30 hours worked, employees get one day of vacation. Also we now want the calculation 
to include how many days vacation they have already taken.
First, we need a new column to store the vacation they have previously taken. Adding this 
column won't affect the running PHP application since it doesn't know about it (this is a good 
reminder never to do select * in an application). The new column is created and, for the 
purpose of this example, populated with some arbitrary values:
Script 96: ed3.sql
-- Run as HR
alter table myemp add daysvacationtaken number;
update myemp set daysvacationtaken = 2 where name = 'alison';
update myemp set daysvacationtaken = 3 where name = 'kris';
update myemp set daysvacationtaken = 0 where name = 'wenji';
commit;
(For more complex migration scenarios the editioning feature has crossedition triggers and 
editioning views to help ensure the appropriate data is used in the old and new editions.)
Now create the new version of the PL/SQL function. In SQL*Plus as HR create a new 
edition:
Script 97: ed4.sql
-- Run as HR
create edition e2;
Create the updated version of the PL/SQL procedure. Because the SQL*Plus session is now 
running in edition E2 this new procedure won't affect the PHP application which is running 
using edition ORA$BASE:
Script 98: ed5.sql
-- Run as HR
alter session set edition = e2;
create or replace function vacationdaysleft(p_name in varchar2) return number as
vdl number;
begin
-- For every 30 hours worked, you get 1 day of vacation
select floor(hoursworked / 30) - daysvacationtaken into vdl
from myemp
228
C# PDF Digital Signature Library: add, remove, update PDF digital
things. Add a signature or an empty signature field in any PDF file page. Search unsigned signature field in PDF document. Prepare
pdf form creator; android edit pdf forms
VB.NET PDF Digital Signature Library: add, remove, update PDF
things. Add a signature or an empty signature field in any PDF file page. Search unsigned signature field in PDF document. Prepare
change font in pdf form; add form fields to pdf without acrobat
Easy PL/SQL Upgrades With Edition Based Redefinition
where myemp.name = p_name;
return vdl;
end;
/
Querying it shows the updated values:
SQL> select name, vacationdaysleft(name) from myemp;
NAME                           VACATIONDAYSLEFT(NAME)
------------------------------ ----------------------
alison                                              4
kris                                                3
wenji                                               6
This is all done while others users continue to use the PHP application live and get the original 
results. The new PL/SQL procedure shows Alison now has only 4 days of vacation. You can run 
the PHP script and check it still returns the "old" value:
alison has 5 days vacation left
Now copy the PHP file to edition2.php and change the oci_set_edition() function to set the 
new edition:
Script 99: edition2.php
<?php
oci_set_edition('e2');
$c = oci_connect('hr', 'welcome', 'localhost/XE');
$s = oci_parse($c, "begin :vdl := vacationdaysleft(:name); end;");
oci_bind_by_name($s, ":vdl", $vdl, 10);
oci_bind_by_name($s, ":name", $name, 10);
$name = 'alison';
oci_execute($s);
echo "$name has ".$vdl." days vacation left\n";;
?>
When edition2.php is run, the output shows the updated calculation of vacation time:
alison has 4 days vacation left
You can run both edition1.php and edition2.php concurrently and they will show different 
results even though the PHP application logic and the PL/SQL procedure name they call is 
identical.
Oracle Database 11gR2 Edition Based Redefinition helps PHP applications meet the goals 
of minimal downtime with the frequent upgrade cycle needed by web applications. It allows 
PHP applications, their often complex stored logic, and large data sets to be updated ready for 
rolling out in production without impacting the operation of existing users.
229
C# PDF insert image Library: insert images into PDF in C#.net, ASP
field. Access to freeware download and online C#.NET class source code. How to insert and add image, picture, digital photo, scanned signature or logo into PDF
change tab order in pdf form; create pdf forms
VB.NET PDF insert image library: insert images into PDF in vb.net
Import graphic picture, digital photo, signature and logo into PDF Add images to any selected PDF page in VB.NET. Insert images into PDF form field in VB.NET.
can reader edit pdf forms; add image to pdf form
Using PL/SQL With OCI8
Database Transactions Across Stateless Web Requests
The DBMS_XA package can be used to start, resume and complete database transactions. 
Web applications can rely on the database to store the transaction state. If you have multiple 
mid-tier web servers, this removes the need to track the state of a set of SQL operations. The 
only shared information needed by each web request is a numeric key identifying the 
transaction. This key should be secured and made available to the application via PHP's 
session handling. 
Using the TOYS table from toyshop.sql (shown in the introduction to packages at the start 
of this chapter) run SQL*Plus and check the current records:
SQL> select * from toys;
ID NAME
---------- ----------------------------------------
2 ball
3 paddling pool
1 bicycle
A DBMS_XA example starts with xa1.php:
Script 100: xa1.php
<?php
$id = 123;
$c = oci_connect('hr', 'welcome', 'localhost/XE');
// Start a transaction, insert a Teddy Bear, and suspend the transaction
$sql =
"declare
rc pls_integer;
begin
rc := dbms_xa.xa_start(dbms_xa_xid(:id), dbms_xa.tmnoflags);
insert into toys (id, name) values (4, 'teddy bear');
rc := dbms_xa.xa_end(dbms_xa_xid(:id), dbms_xa.tmsuspend);
end;";
$s = oci_parse($c, $sql);
oci_bind_by_name($s, ":id", $id);
oci_execute($s);
?>
This script begins a transaction arbitrarily identified as 123, and inserts a new toy. For sake of 
the example, the identifier value is hard coded.
Execute xa1.php:
$ php xa1.php
There is no output.
230
How to C#: Basic SDK Concept of XDoc.PDF for .NET
You may add PDF document protection functionality into your C# program. To be specific, you can edit PDF password and digital signature, and set PDF file
can save pdf form data; chrome pdf save form data
VB.NET PDF: Basic SDK Concept of XDoc.PDF
You may add PDF document protection functionality into your VB.NET program. To be specific, you can edit PDF password and digital signature, and set PDF file
add form fields to pdf; adding text to pdf form
Database Transactions Across Stateless Web Requests
In SQL*Plus check the rows in the table. The new row has not yet been committed and is 
not visible yet.
The second script, xa2.php, resumes transaction number 123, inserts another new row 
and commits the transaction:
Script 101: xa2.php
<?php
$id = 123;
$c = oci_connect('hr', 'welcome', 'localhost/XE');
// Resume the transaction, insert a Stethoscope, and commit
$sql =
"declare
rc pls_integer;
begin
rc := dbms_xa.xa_start(dbms_xa_xid(:id), dbms_xa.tmresume);
insert into toys (id, name) values (5, 'stethoscope');
rc := dbms_xa.xa_commit(dbms_xa_xid(123), true);
end;";
$s = oci_parse($c, $sql);
oci_bind_by_name($s, ":id", $id);
oci_execute($s);
?>
Run this script (there is no output) and then use SQL*Plus to query the table:
SQL> select * from toys;
ID NAME
---------- ----------------------------------------
2 ball
3 paddling pool
4 teddy bear
5 stethoscope
1 bicycle
This shows that both new rows were inserted, even though the PHP scripts were run in 
independent processes, with an unknown time frame. If you don't see the teddy bear row, you 
probably took longer than 60 seconds between running xa1.php and xa2.php. This is the 
default timeout before a transaction is aborted. It can be set with DBMS_XA.XA_SETTIMEOUT.
The DBMS_XA package is a convenient way to conduct transactions across the web. It 
provides functionality to start, suspend, and cancel transactions. The transaction number is 
the only piece of metadata that needs to be chosen and shared across web requests. This is 
easily managed using standard PHP techniques such as with PHP sessions.
231
VB.NET PDF Library SDK to view, edit, convert, process PDF file
NET program. Password, digital signature and PDF text, image and page redaction will be used and customized. PDF Annotation Edit.
convert word document to editable pdf form; change font size pdf fillable form
C# Create PDF Library SDK to convert PDF from other file formats
you can add some additional information to generated PDF file. What's more, you can also protect created PDF file by adding digital signature (watermark) on
add text field to pdf; add attachment to pdf form
Using PL/SQL With OCI8
232
C# PDF Convert to Images SDK: Convert PDF to png, gif images in C#
image files including all PDF contents, like watermark and signature in .NET. C#.NET DLLs Solution for Converting Images to PDF in C# Add necessary references:
changing font size in pdf form field; pdf form save in reader
C# PDF remove image library: remove, delete images from PDF in C#.
Support removing vector image, graphic picture, digital photo, scanned signature, logo, etc. Remove Image from PDF Page Using C#. Add necessary references:
adding form fields to pdf; change font size pdf form reader
CHAPTER 13
U
SING
L
ARGE
O
BJECTS
IN
OCI8
Oracle Character Large Object (CLOB) and Binary Large Object (BLOB) types can be used for 
very large amounts of data. They can be used for table columns and as PL/SQL variables. A 
pre-supplied DBMS_LOB package makes manipulation in PL/SQL easy. OCI8 LOB methods 
allow storing and fetching LOB data in PHP
Oracle also has a BFILE type for large objects stored outside the database.
Working With LOBs
In successive versions, the Oracle database has made it easier to work with LOBs. Along the 
way “Temporary LOBs” were added, and some string-to-LOB conversions are now transparent 
so data can be handled directly as strings. Develop and test your LOB application with the 
Oracle client libraries and database that will be used for deployment so you can be sure all 
the expected functionality is available.
When working with large amounts of data, set memory_limit appropriately in php.ini 
otherwise PHP may terminate early. When reading or writing files to disk, check if 
open_basedir allows file access.
These example show BLOBs. Using CLOBs is almost identical to using BLOBs: the 
descriptor type becomes OCI_D_CLOB, the bind type becomes OCI_B_CLOB, and tables must 
obviously contain a CLOB column.
The examples use a table created in SQL*Plus containing a BLOB column called BLOBDATA:
SQL> create table mybtab (blobid number primary key, blobdata blob);
Note querying BLOB columns in SQL*Plus is not possible unless SQL*Plus 11g is used, where it 
will display a hexadecimal version of the data. Tables with CLOB columns can be queried in all 
versions of SQL*Plus. The output of BLOB and CLOB data can be controlled in SQL*Plus with 
the SET LONG command. The default value of 80 means that only the first 80 characters of 
data will be displayed by a query.
LOB database storage and access options can be configured at table creation time, or with 
ALTER TABLE. Frequently accessed LOBs will benefit from monitoring their use and adjusting 
their configuration. One common tuning step is to turn on LOB caching:
SQL> alter table mybtab modify lob (blobdata) (cache);
In Oracle 11g you can optionally create LOBs with the storage option SECUREFILE to take 
advantage of LOB SecureFile features such as deduplication and compression.
Inserting and Updating LOBs
In PHP, LOBs are generally manipulated using a descriptor. PHP code to insert into MYBTAB is:
Script 102: blobinsert.php
<?php
$c = oci_connect('hr', 'welcome', 'localhost/XE');
233
Using Large Objects in OCI8
$myblobid = 123;
$myv = 'a very large amount of binary data';
$s = oci_parse($c, 'insert into mybtab (blobid, blobdata)
values (:myblobid, EMPTY_BLOB())
returning blobdata into :blobdata');
$lob = oci_new_descriptor($c, OCI_D_LOB);
oci_bind_by_name($s, ':myblobid', $myblobid);
oci_bind_by_name($s, ':blobdata', $lob, -1, OCI_B_BLOB);
oci_execute($s, OCI_NO_AUTO_COMMIT);  // Don't commit so $lob->save() works
$lob->save($myv);
oci_commit($c);
$lob->close();                 // close LOB descriptor to free resources
?>
The RETURNING clause returns the Oracle LOB locator of the new row. By binding as 
OCI_B_BLOB, the PHP descriptor in $lob references this locator. The $lob->save() method 
then stores the data in $myv into the BLOB column. The OCI_NO_AUTO_COMMIT flag is used 
for oci_execute() so the descriptor remains valid for the save() method. The commit 
concludes the insert and makes the data visible to other database users.
If the application uploads LOB data using a web form, it can be inserted directly from the 
upload directory with $lob->import($filename). PHP’s maximum allowed size for uploaded 
files is set in php.ini using the upload_max_filesize parameter.
To update a LOB, use the same code with this SQL statement:
$s = oci_parse($c, 'update mybtab set
blobdata = empty_blob()
returning blobdata into :blobdata');
Fetching LOBs
When fetching a LOB, OCI8 returns a LOB descriptor. The data can be retrieved by using a 
load() or read() method:
Script 103: blobfetch.php
<?php
$c = oci_connect('hr', 'welcome', 'localhost/XE');
$myblobid = 123;
$query = 'select blobdata from mybtab where blobid = :myblobid';
$s = oci_parse ($c, $query);
oci_bind_by_name($s, ':myblobid', $myblobid);
oci_execute($s);
$arr = oci_fetch_array($s, OCI_ASSOC);
if (is_object($arr['BLOBDATA'])) {  // protect against a NULL LOB
$data = $arr['BLOBDATA']->load();
$arr['BLOBDATA']->free();
234
Working With LOBs
echo $data;
}
?>
It is important to free all returned LOB locators to avoid leaks:
while (($arr = oci_fetch_array($s, OCI_ASSOC))) {
echo $arr['BLOBDATA']->load();   // do something with the BLOB
$arr['BLOBDATA']->free();        // cleanup before next fetch
}
If LOBS are not freed, the ABSTRACT_LOBS column in the V$TEMPORARY_LOBS table will show 
increasing values.
Instead of using locators, LOB data can alternatively be returned as a string:
$arr = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_LOBS);
echo $arr['BLOBDATA'];
If the returned data is larger than expected, PHP may not be able to allocate enough memory. 
To protect against this, use a locator with the read() method, which allows the data to be 
fetched in chunks.
When doing SELECT … FOR UPDATE, use oci_execute($s, OCI_NO_AUTO_COMMIT) 
otherwise you will get an ORA-01002: fetch out of sequence error when fetching the LOB.
In LOB-fetching loops it is good practice to free local PHP variables containing LOB data 
before fetching the next record. This can reduce the overall memory use of PHP, because only 
one LOB value needs to be held in memory at a time, instead of the original and new values:
while (($arr = oci_fetch_array($s, OCI_ASSOC))) {
$arr = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_LOBS);
echo $arr['BLOBDATA'];   // do something with the LOB
unset($arr);             // free PHP's memory before fetching the next LOB.
}
Temporary LOBs
Temporary LOBs are created and maintained in the database. PHP accesses the LOB there for 
reading and writing. Temporary LOBs are not persistent and are available only within the 
current PHP connection. Temporary LOBs make some operations easier. 
Inserting data with a Temporary LOB does not use a RETURNING INTO clause, for example:
Script 104: tempblobinsert.php
<?php
$c = oci_connect('hr', 'welcome', 'localhost/XE');
$myblobid = 124;
$myv = 'a very large amount of binary data';
$s = oci_parse($c, 'insert into mybtab (blobid, blobdata)
values (:myblobid, :blobdata)');
$lob = oci_new_descriptor($c, OCI_D_LOB);
oci_bind_by_name($s, ':myblobid', $myblobid);
235
Using Large Objects in OCI8
oci_bind_by_name($s, ':blobdata', $lob, -1, OCI_B_BLOB);
$lob->writeTemporary($myv, OCI_TEMP_BLOB);
oci_execute($s, OCI_NO_AUTO_COMMIT);
oci_commit($c);
$lob->close();     // close lob descriptor to free resources
?>
Temporary LOBs also simplify updating values:
$s = oci_parse($c, 'update mybtab set blobdata = :bd where blobid = :bid');
If you want to either insert a new row or update existing data if the row turns out to exist 
already, the SQL statement can be changed to use an anonymous block :
$s = oci_parse($c,
'begin'
. '  insert into mybtab (blobdata, blobid) values(:blobdata, :myblobid);'
. '  exception'
. '  when dup_val_on_index then'
. '    update mybtab set blobdata = :blobdata where blobid = :myblobid;'
. 'end;');
Uploading and Displaying an Image
The script image.php shows how a JPEG image can be uploaded and inserted into the 
database. After the data is inserted, it queries the image data back immediately and displays 
the picture to verify the insert and query work. The same MYBTAB table as created above is 
used.
Script 105: image.php
<?php
if (!isset($_FILES['lob_upload'])) {
?>
<h1>BLOB Example - Uploading a JPEG</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"
enctype="multipart/form-data">
JPEG image filename: <input type="file" name="lob_upload">
<input type="submit" value="Upload">
</form>
<?php
} else {
$c = oci_connect('hr', 'welcome', 'localhost/xe');
$myblobid = 1;  // should really be a unique id e.g. a sequence number
// Delete any existing BLOB so the query at the bottom
// displays the new data
$sql = 'delete from mybtab where blobid = :myblobid';
$s = oci_parse ($c, $sql);
236
Documents you may be interested
Documents you may be interested