<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<link rel="Start" href="index.html">
<link rel="Up" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
<link title="Index of values" rel=Appendix href="index_values.html">
<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
<link title="Index of class methods" rel=Appendix href="index_methods.html">
<link title="Index of classes" rel=Appendix href="index_classes.html">
<link title="Index of modules" rel=Appendix href="index_modules.html">
<link title="Occi" rel="Chapter" href="Occi.html"><link title="Types and Exceptions" rel="Section" href="#3_TypesandExceptions">
<link title="Functional API" rel="Section" href="#3_FunctionalAPI">
<link title="Object-Oriented API" rel="Section" href="#3_ObjectOrientedAPI">
<title>Occi</title>
</head>
<body>
<div class="navbar"> <a href="index.html">Up</a>
</div>
<center><h1>Module <a href="type_Occi.html">Occi</a></h1></center>
<br>
<pre><span class="keyword">module</span> Occi: <code class="code"><span class="keyword">sig</span></code> <a href="Occi.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>This OCAML library implements an Oracle client interface using OCCI C++
Oracle library built on top of OCI.
<p>
The library was only tested on Linux, but should work on Windows as well.
Bug reports should be submitted to the
<a href="mailto:Serge Aleynikov <serge@corp.idt.net>">author</a>.
<p>
<b>Library features</b>
<p>
The following operations with an Oracle database are supported:
<p>
<ul>
<li>Simple DML operations including SELECT / INSERT / UPDATE / DELETE</li>
<li>Parameterized DML operations including SELECT / INSERT / UPDATE / DELETE</li>
<li>Execution of PL/SQL stored procedures</li>
<li>Execution of bulk DML array INSERT / DELETE / UPDATE operations</li>
<li>Oracle exception handling</li>
<li>Oracle bulk exception handling with specifying failed rows and errors for each row</li>
<li>Transaction control (commit and rollback)</li>
<li>Automatic garbage control of Oracle resources (connections, statements
and cursors)</li>
<li>Functional and Object-Oriented API included</li>
</ul>
This library requires Oracle 10g (at least 10g Release 2) instant client library
to be installed on a client machine. OCCI requires only four shared
libraries (or dynamic link libraries, as they are called on some operating
systems) to be loaded by the dynamic loader of the operating system.
Oracle Database 10g Release 2 (10.2) library names are used; the number
part of library names will change to remain consistent with future release
numbers.
<p>
<b>Installing Instant Client</b>
<p>
OCCI requires only four shared libraries (or dynamic link libraries, as
they are called on some operating systems) to be loaded by the dynamic loader
of the operating system. Oracle Database 10g Release 2 (10.2) library names
are used; the number part of library names will change to remain consistent
with future release numbers.
<p>
<ul>
<li>OCI Instant Client Data Shared Library (<code class="code">libociei.so</code> on Linux and UNIX
and <code class="code">oraociei10.dll</code> on Windows); correct installation of this file
determines if you are operating in Instant Client mode</li>
</ul>
<ul>
<li>Client Code Library (<code class="code">libclntsh.so.10.1</code> on Linux and UNIX and
<code class="code">oci.dll</code> on Windows)</li>
</ul>
<ul>
<li>Security Library (<code class="code">libnnz10.so</code> on Linux and UNIX and
<code class="code">orannzsbb10.dll</code> on Windows)</li>
</ul>
<ul>
<li>OCCI Library (<code class="code">libocci.so.10.1</code> on Linux and UNIX and <code class="code">oraocci10.dll</code> on Windows)</li>
</ul>
These shared libraries can be obtained from
<a href="http://www.oracle.com/technology/tech/oci/instantclient/">Oracle Technology Network</a>.
<p>
Note: if you are getting a segmentation fault when running
the test program or the following compilation warning:
<code class="code">/usr/bin/ld: warning: libstdc++.so.5, needed by ...../libocci.so, may conflict <span class="keyword">with</span> libstdc++.so.6</code>
this means that you have a <code class="code">gcc</code> version 3.4.3 or later, and the Oracle Instant
Client was built with <code class="code">gcc</code> 3.2.3. Obtain a patch from:
<a href="http://www.oracle.com/technology/tech/oci/occi/occidownloads.html">OCCI patch</a>.
<p>
If these four libraries are accessible through the directory on the OS
Library Path variable (LD_LIBRARY_PATH on Linux and UNIX and PATH on
Windows), then OCCI operates in the Instant Client mode. In this mode,
there is no dependency on ORACLE_HOME and none of the other code and data
files provided in ORACLE_HOME are needed by OCCI.
<p>
Also note that when using instant client the TNS_ADMIN variable should point
to a directory containing Oracle resolver data (sqlnet.ora and tnsnames.ora). See
Oracle documentation on configuring instant client.
<p>
<b>Example Usage</b>
<p>
See <code class="code">occi_test.ml</code> for sample test cases. Below find a simple example
illustrating a select statement with bind variables. A more interesting
example can be found <a href="#VALocci_execute_array">here</a>.
<p>
<pre></pre><code class="code"> <span class="keyword">open</span> <span class="constructor">Occi</span>;<br>
<br>
value con = occi_connect <span class="string">"scott"</span> <span class="string">"tiger"</span> <span class="string">"mydb"</span>;<br>
value stmt = occi_create_statement con <span class="string">""</span>;<br>
<span class="keyword">let</span> (_, records) = <br>
ora_select stmt <span class="string">"select * from test where name like :1"</span> [| <span class="constructor">Var_str</span> <span class="string">"Al%"</span> |]<br>
<span class="keyword">in</span> <br>
<span class="constructor">List</span>.iter print_record records;<br>
</code><pre></pre><br>
<b>Author(s):</b> Serge Aleynikov (serge\@corp.idt.net)<br>
<b>Version:</b> $Rev: 448 $ $Date: 2006-10-30 19:09:00 -0500 (Mon, 30 Oct 2006) $<br>
<b>See also</b> <a href="http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14294/toc.htm">OCCI docs</a><br>
<hr width="100%">
<br>
<a name="3_TypesandExceptions"></a>
<h3>Types and Exceptions</h3><br>
<pre><span class="keyword">type</span> <a name="TYPEora_env"></a><code class="type"></code>ora_env </pre>
<pre><span class="keyword">type</span> <a name="TYPEora_connection"></a><code class="type"></code>ora_connection </pre>
<pre><span class="keyword">type</span> <a name="TYPEora_statement"></a><code class="type"></code>ora_statement </pre>
<pre><span class="keyword">type</span> <a name="TYPEcursor"></a><code class="type"></code>cursor </pre>
<br><code><span class="keyword">type</span> <a name="TYPEora_value"></a><code class="type"></code>ora_value = </code><table class="typetable">
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Null</span></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Int</span> <span class="keyword">of</span> <code class="type">int</code></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Date</span> <span class="keyword">of</span> <code class="type">float</code></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Float</span> <span class="keyword">of</span> <code class="type">float</code></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Str</span> <span class="keyword">of</span> <code class="type">string</code></code></td>
</tr></table>
<div class="info">
This type is for use as a result of a query<br>
</div>
<br><code><span class="keyword">type</span> <a name="TYPEparam_val"></a><code class="type"></code>param_val = </code><table class="typetable">
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Null_int</span></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Null_date</span></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Null_float</span></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Null_str</span></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Var_int</span> <span class="keyword">of</span> <code class="type">int</code></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Var_date</span> <span class="keyword">of</span> <code class="type">float</code></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Var_float</span> <span class="keyword">of</span> <code class="type">float</code></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Var_str</span> <span class="keyword">of</span> <code class="type">string</code></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Var_out_int</span></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Var_out_date</span></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Var_out_float</span></code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code><span class="keyword">|</span></code></td>
<td align="left" valign="top" >
<code><span class="constructor">Var_out_str</span> <span class="keyword">of</span> <code class="type">int</code></code></td>
</tr></table>
<div class="info">
This type is for use in parameterized queries<br>
</div>
<br><code><span class="keyword">type</span> <a name="TYPEdescribed_column"></a><code class="type"></code>described_column = {</code><table class="typetable">
<tr>
<td align="left" valign="top" >
<code> </code></td>
<td align="left" valign="top" >
<code>name : <code class="type">string</code>;</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code> </code></td>
<td align="left" valign="top" >
<code>ctype : <code class="type">string</code>;</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code> </code></td>
<td align="left" valign="top" >
<code>len : <code class="type">int</code>;</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code> </code></td>
<td align="left" valign="top" >
<code>scale : <code class="type">int</code>;</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code> </code></td>
<td align="left" valign="top" >
<code>not_null : <code class="type">bool</code>;</code></td>
</tr></table>
}
<br>
This type is for use by the occi_describe function<br>
<pre><span class="keyword">exception</span> <a name="EXCEPTIONORA_EXCEPTION"></a>ORA_EXCEPTION <span class="keyword">of</span> <code class="type">(int * string)</code></pre>
<div class="info">
Oracle API functions raise this exception containing
<code class="code">(err_code * err_message)</code><br>
</div>
<pre><span class="keyword">exception</span> <a name="EXCEPTIONORA_BULK_EXCEPTION"></a>ORA_BULK_EXCEPTION <span class="keyword">of</span> <code class="type">(string * (int * int * string) array)</code></pre>
<div class="info">
<code class="code">occi_execute_array</code> function raises this exception containing
<code class="code">(error_message, failed_rows)</code>, where the <code class="code">failed_rows</code> is an array of tuples
in the form <code class="code">(row_number, err_code, err_message)</code>.
The first row in the original array of records has number 0.<br>
</div>
<br>
<a name="3_FunctionalAPI"></a>
<h3>Functional API</h3><br>
<pre><span class="keyword">val</span> <a name="VALdecode_occi_type"></a><a href="code_VALOcci.decode_occi_type.html">decode_occi_type</a> : <code class="type">int -> string</code></pre><div class="info">
<code class="code">decode_occi_type column</code> used to convert the column type to string or
<code class="code">ora_column_type</code> type<br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
??</td>
<td align="center" valign="top">:</td>
<td><code class="type">int</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALocci_connect"></a><a href="code_VALOcci.occi_connect.html">occi_connect</a> : <code class="type">string -> string -> string -> <a href="Occi.html#TYPEora_connection">ora_connection</a></code></pre><div class="info">
<code class="code">occi_connect user password database <span class="keywordsign">-></span> connection</code> creates a connection to an
Oracle database. The connection is managed automatically by the CAML garbage
collector, or it can be disconnected manually by issuing a call to <code class="code">occi_disconnect</code>.
<p>
<b>Example:</b>
<pre></pre><code class="code">value con = occi_connect <span class="string">"scott"</span> <span class="string">"tiger"</span> <span class="string">"mydb"</span>;</code><pre></pre><br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_disconnect"></a><a href="code_VALOcci.occi_disconnect.html">occi_disconnect</a> : <code class="type"><a href="Occi.html#TYPEora_connection">ora_connection</a> -> unit</code></pre><div class="info">
<code class="code">occi_disconnect connection <span class="keywordsign">-></span> unit</code> disconnects a previously open Oracle
connection<br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_create_statement"></a><a href="code_VALOcci.occi_create_statement.html">occi_create_statement</a> : <code class="type"><a href="Occi.html#TYPEora_connection">ora_connection</a> -> string -> <a href="Occi.html#TYPEora_statement">ora_statement</a></code></pre><div class="info">
<code class="code">occi_create_statement con sql</code> creates an Oracle statement. The sql string can be
left blank, in which case it must be initialized in the call to <code class="code">occi_prepare_sql</code> or
any function in the <code class="code">occi_execute*</code> family. The statement is managed automatically by
the garbage collector, so it doesn't need to be freed explicitely.
<p>
<b>Example:</b>
<pre></pre><code class="code">value stmt = occi_create_statement con <span class="string">""</span>;</code><pre></pre><br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_free_statement"></a><a href="code_VALOcci.occi_free_statement.html">occi_free_statement</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -> unit</code></pre><div class="info">
<code class="code">occi_free_statement stmt</code> frees an Oracle statement created with <code class="code">ora_create_statement</code>.
Note that it's not necessary to call this function, as the statement object is
automatically managed by the garbage collector<br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_prepare_sql"></a><a href="code_VALOcci.occi_prepare_sql.html">occi_prepare_sql</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -> string -> unit</code></pre><div class="info">
<code class="code">occi_prepare_sql stmt sql</code> sets an SQL string for a given statement.<br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_prepare_plsql"></a><a href="code_VALOcci.occi_prepare_plsql.html">occi_prepare_plsql</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -> string -> (int * <a href="Occi.html#TYPEparam_val">param_val</a>) list -> unit</code></pre><div class="info">
<code class="code">occi_prepare_plsql stmt sql [ (pos * param_val) ] </code>
sets sql text of a PL/SQL statement, and specifies OUT parameters. The parameters are given
as an array of tuples, where <code class="code">pos</code> indicates the parameter number, <code class="code">param_val</code>
is one of <code class="code"><span class="constructor">OutInt</span>; <span class="constructor">OutStr</span> <span class="keyword">of</span> int; <span class="constructor">OutFloat</span>; <span class="constructor">OutDate</span></code>, and OutStr specifies the max string
size in bytes.
<p>
This function allows to prepare the SQL statement prior to calling <code class="code">occi_execute</code> or
<code class="code">occi_execute_plsql</code>.
<p>
<b>Example:</b>
<p>
<pre></pre><code class="code">occi_prepare_plsql stmt <span class="string">"begin :1 := my_fun(:2); end;"</span> [(1, <span class="constructor">Var_out_str</span> 30)];<br>
<span class="keyword">match</span> (occi_execute_plsql stmt [(2, <span class="constructor">Var_int</span> 10)]) <span class="keyword">with</span><br>
[ [(1, <span class="constructor">Var_str</span> s)] <span class="keywordsign">-></span> print_endline s];<br>
</code><pre></pre><br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_describe"></a><a href="code_VALOcci.occi_describe.html">occi_describe</a> : <code class="type"><a href="Occi.html#TYPEora_connection">ora_connection</a> -> string -> (string * int * int * int * bool) array</code></pre><pre><span class="keyword">val</span> <a name="VALora_describe"></a><a href="code_VALOcci.ora_describe.html">ora_describe</a> : <code class="type"><a href="Occi.html#TYPEora_connection">ora_connection</a> -> string -> <a href="Occi.html#TYPEdescribed_column">described_column</a> array</code></pre><div class="info">
<code class="code">ora_describe ora_connection table_name</code> descrites a table by returning an array of
field descriptors.
<p>
<b>Example:</b>
<pre></pre><code class="code"> <span class="constructor">Array</span>.iter <br>
(<span class="keyword">fun</span> {name=a; ctype=b; len=c; scale=e; not_null=f} <span class="keywordsign">-></span> <br>
<span class="constructor">Printf</span>.printf <span class="string">" %-30s %-10s %5d %5d %5b\n"</span> a b c e f)<br>
(occi_describe con <span class="string">"test"</span>);<br>
</code><pre></pre><br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
con</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEora_connection">ora_connection</a></code><br>
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
table</td>
<td align="center" valign="top">:</td>
<td><code class="type">string</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALocci_execute"></a><a href="code_VALOcci.occi_execute.html">occi_execute</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -><br> string -> (int * <a href="Occi.html#TYPEparam_val">param_val</a>) list -> (int * <a href="Occi.html#TYPEora_value">ora_value</a>) list</code></pre><div class="info">
<code class="code">occi_execute stmt sql params <span class="keywordsign">-></span> out_values</code> executes a PL/SQL block
by preparing an <code class="code">sql</code> text, binding it with a list of <code class="code">params</code> where each element is
a tuple (position:int * value:param_val), and returns the <code class="code">out_values</code> result
as a list of (position:int * value:ora_value) tuples where each value represents the
value of an OUT parameter at a given position.
<p>
<b>Example:</b> <pre></pre><code class="code"> <span class="keyword">let</span> lst = occi_execute stmt <span class="string">"begin :1 = my_fun(:2); end;"</span><br>
[(1, <span class="constructor">Var_out_int</span>), (2, <span class="constructor">Var_float</span> 2.0)]<br>
<span class="keyword">in</span> <span class="constructor">List</span>.iter (<span class="keyword">fun</span> (i, v) <span class="keywordsign">-></span> <span class="constructor">Printf</span>.printf <span class="string">"%d, %s\n"</span> i (field_to_string v)) lst;<br>
</code><pre></pre><br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_fetch"></a><a href="code_VALOcci.occi_fetch.html">occi_fetch</a> : <code class="type"><a href="Occi.html#TYPEcursor">cursor</a> -> <a href="Occi.html#TYPEora_value">ora_value</a> array</code></pre><div class="info">
<code class="code">occi_fetch rs</code> returns data as an array of fields. This is an internal function, so
it's recommended to use the occi_fetch_foreach instead.<br>
<b>Raises</b> <code>End_of_file</code> when there are no more rows in the cursor.<br>
</div>
<pre><span class="keyword">val</span> <a name="VALora_fetch_foreach"></a><a href="code_VALOcci.ora_fetch_foreach.html">ora_fetch_foreach</a> : <code class="type"><a href="Occi.html#TYPEcursor">cursor</a> -> (<a href="Occi.html#TYPEora_value">ora_value</a> array -> unit) -> unit</code></pre><div class="info">
<code class="code">ora_fetch_foreach cursor f</code> applies the function <code class="code">f: array ora_values <span class="keywordsign">-></span> unit</code> to
each record in the <code class="code">cursor</code>.<br>
<b>Raises</b> <code>End_of_file</code> when there are no more rows in the cursor.
<p>
<b>Example:</b>
<pre></pre><code class="code"> <span class="keyword">let</span> (cursor, _) = occi_execute_query stmt <span class="string">"select * from test"</span> <span class="keyword">in</span> <br>
<span class="keyword">try</span><br>
ora_fetch_foreach cursor (<span class="keyword">fun</span> [| <span class="constructor">Int</span> i; <span class="constructor">Str</span> s |] <span class="keywordsign">-></span> <span class="constructor">Printf</span>.printf <span class="string">"%d - %s\n"</span> i s)<br>
<span class="keyword">with</span><br>
[ <span class="constructor">End_of_file</span> <span class="keywordsign">-></span> () ]; </code><pre></pre><br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
rs</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEcursor">cursor</a></code><br>
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
f</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEora_value">ora_value</a> array -> unit</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALora_fetch_foreach_list"></a><a href="code_VALOcci.ora_fetch_foreach_list.html">ora_fetch_foreach_list</a> : <code class="type">?max_rows:int option -><br> <a href="Occi.html#TYPEcursor">cursor</a> -> (<a href="Occi.html#TYPEora_value">ora_value</a> array list -> bool) -> unit</code></pre><div class="info">
<code class="code">ora_fetch_foreach_list cursor max_rows f</code> fetches up to max_rows of
records from an open cursor to list, and applies function <code class="code">f</code> to that
list. Function <code class="code">f</code> should return <code class="code"><span class="constructor">False</span></code> if there's no need to continue
fetching records, or <code class="code"><span class="constructor">True</span></code> otherwise. If max_rows is <code class="code"><span class="constructor">None</span></code> then all
records are retrieved and passed to the <code class="code">f</code> function. If max_rows is
<code class="code"><span class="constructor">Some</span> n</code> then the list passed to the <code class="code">f</code> function will contain at most
<code class="code">n</code> elements.
<p>
<b>Example:</b> <pre></pre><code class="code"> <span class="keyword">let</span> (cursor, _) = occi_execute_query stmt <span class="string">"select * from test"</span> <span class="keyword">in</span> <br>
<span class="comment">(* Process records 10-elements at a time *)</span><br>
ora_fetch_foreach_list cursor (<span class="keyword">fun</span> data <span class="keywordsign">-></span> <span class="keyword">do</span> {<span class="constructor">List</span>.iter process_record data; <span class="constructor">True</span>}) ~max_rows:10;<br>
</code><pre></pre><br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
max_rows</td>
<td align="center" valign="top">:</td>
<td><code class="type">int option</code><br>
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
cur</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEcursor">cursor</a></code><br>
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
f</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEora_value">ora_value</a> array list -> bool</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALora_fetch_list"></a><a href="code_VALOcci.ora_fetch_list.html">ora_fetch_list</a> : <code class="type">?max_rows:int option -><br> <a href="Occi.html#TYPEcursor">cursor</a> -> <a href="Occi.html#TYPEcursor">cursor</a> option * <a href="Occi.html#TYPEora_value">ora_value</a> array list</code></pre><div class="info">
<code class="code">ora_fetch_list cursor max_rows</code> fetches up to max_rows of records from an
open cursor to list. If max_rows is <code class="code"><span class="constructor">None</span></code> and/or all records are retrieved then
result will contain <code class="code">(<span class="constructor">None</span>, data_list)</code>. If max_rows is <code class="code"><span class="constructor">Some</span> n</code> then
after fetching <code class="code">max_rows</code> rows, the function will return <code class="code">(<span class="constructor">Some</span> cursor, data_list)</code>,
and the <code class="code">cursor</code> could be used in successive calls to <code class="code">ora_fetch_list</code>.
<p>
<b>Example:</b> <pre></pre><code class="code"> <span class="keyword">let</span> (cursor, _) = occi_execute_query stmt <span class="string">"select * from test"</span> <span class="keyword">in</span> <br>
<span class="keyword">let</span> (_, data) = ora_fetch_list cursor <span class="constructor">None</span> <span class="keyword">in</span><br>
<span class="constructor">List</span>.iter process_record data; </code><pre></pre><br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
max_rows</td>
<td align="center" valign="top">:</td>
<td><code class="type">int option</code><br>
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
cur</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEcursor">cursor</a></code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALocci_execute_query"></a><a href="code_VALOcci.occi_execute_query.html">occi_execute_query</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -> string -> <a href="Occi.html#TYPEcursor">cursor</a> * string array</code></pre><div class="info">
<code class="code">occi_execute_query stmt sql <span class="keywordsign">-></span> (cursor * field_names)</code> executes an Oracle query
and returns an open cursor and an array of field names. The cursor can be fetched
using <code class="code">occi_fetch</code> function. <code class="code">sql</code> can be empty, in which case the sql value is
taken from the <code class="code">occi_statement con sql</code> call.<br>
<b>Returns</b> an opaque cursor object that can be fetched from using occi_fetch and an
array of field names.<br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_execute_param_query"></a><a href="code_VALOcci.occi_execute_param_query.html">occi_execute_param_query</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -><br> string -> <a href="Occi.html#TYPEparam_val">param_val</a> array -> <a href="Occi.html#TYPEcursor">cursor</a> * string array</code></pre><div class="info">
<code class="code">occi_execute_param_query stmt sql params <span class="keywordsign">-></span> (cursor * field_names)</code> executes an Oracle query.
It is the same as <code class="code">occi_execute_query</code> with the exception that it takes an array of parameter
values. The query should be a SELECT statement with bind variables in the form: ":1" ... ":N"
where each ":i" will represent the i-th parameter from the <code class="code">params</code> array.
<p>
<b>Example:</b>
<pre></pre><code class="code"> <span class="keyword">let</span> stmt = occi_create_statement con <span class="string">""</span> <span class="keyword">in</span> <br>
<span class="keyword">let</span> (cursor, fields) = occi_execute_param_query stmt<br>
<span class="string">"SELECT * FROM TEST WHERE ID < :1 and NAME LIKE :2"</span> <br>
[| <span class="constructor">Var_int</span> 100; <span class="constructor">Var_str</span> <span class="string">"S%"</span> |]<br>
<span class="keyword">in</span> <span class="constructor">List</span>.iter do_fetch_record cursor; </code><pre></pre><br>
</div>
<pre><span class="keyword">val</span> <a name="VALora_select"></a><a href="code_VALOcci.ora_select.html">ora_select</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -><br> string -><br> ?max_rows:int option -><br> <a href="Occi.html#TYPEparam_val">param_val</a> array -><br> <a href="Occi.html#TYPEcursor">cursor</a> option * string array * <a href="Occi.html#TYPEora_value">ora_value</a> array list</code></pre><div class="info">
This function selects records given a SELECT SQL command, and returns result in a
form of a list. Note that this function doesn't raise <code class="code"><span class="constructor">End_of_file</span></code> exception upon
reaching the end of a cursor.<br>
<b>Returns</b> <code class="code">(cursor, list_of_records)</code>, where the <code class="code">cursor</code> is either None or a value that
can be passed to <code class="code">ora_fetch_list</code> function to process remaining records.
<p>
<b>Example:</b> <pre></pre><code class="code"> <span class="keyword">let</span> (_, _, lst) = <br>
ora_select stmt <span class="string">"select * from test where id < :1"</span> [| <span class="constructor">Var_int</span> 10 |])<br>
<span class="keyword">in</span><br>
<span class="constructor">List</span>.iter print_record lst;<br>
</code><pre></pre><br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
stmt</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a></code><br>
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
sql</td>
<td align="center" valign="top">:</td>
<td><code class="type">string</code><br>
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
max_rows</td>
<td align="center" valign="top">:</td>
<td><code class="type">int option</code><br>
defines the maximum number of rows to return (<code class="code"><span class="constructor">None</span></code> means all,
which is the default).
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
params</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEparam_val">param_val</a> array</code><br>
is an array of bind paramerer values. If it's not empty, the query is
expected to contain parameters in the form ":1" ... ":N" that will be bound
using values from the array at corresponding positions. The bind parameter
indexes begin with ":1".
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALocci_execute_array"></a><a href="code_VALOcci.occi_execute_array.html">occi_execute_array</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -> string -> <a href="Occi.html#TYPEparam_val">param_val</a> array list -> int</code></pre><div class="info">
<code class="code">occi_execute_array stmt</code> executes an SQL INSERT/UPDATE/DELETE bulk operation. The
parameter list contains arrays of field values. Each array can be thought of a
record in an Oracle table associated with the INSERT/UPDATE/DELETE operation. This
function uses a bulk interface, so that only one network roundtrip is performed
for the entire list of parameter values.<br>
<b>Raises</b> <code>ORA_BULK_EXCEPTION</code> See example below on how to
retrieve the error codes for the failed rows.
<p>
<b>Example:</b> <pre></pre><code class="code"> <br>
<span class="keyword">try</span><br>
<span class="keyword">match</span> occi_execute_array stmt <br>
[<br>
[| <span class="constructor">Var_int</span> 1, <span class="constructor">Null_str</span>, <span class="constructor">Var_date</span> (encode_date (2006,1,1,0,0,0)) |],<br>
[| <span class="constructor">Var_int</span> 1, <span class="constructor">Var_str</span> <span class="string">"abc"</span>, <span class="constructor">Null_date</span> |],<br>
...<br>
]<br>
<span class="keyword">with</span> [n <span class="keywordsign">-></span> <span class="constructor">Printf</span>.printf <span class="string">"Inserted %d records\n"</span> n]<br>
<span class="keyword">with</span> [<br>
<span class="constructor">ORA_BULK_EXCEPTION</span> (err_message, failed_rows) <span class="keywordsign">-></span> <span class="keyword">do</span> {<br>
<span class="constructor">Printf</span>.printf <span class="string">"Failed %d rows. Reason: %s\n"</span> (<span class="constructor">Array</span>.length failed_rows) err_message;<br>
<span class="constructor">Array</span>.iter (<span class="keyword">fun</span> (i, e, m) <span class="keywordsign">-></span> <span class="constructor">Printf</span>.printf <span class="string">" Row %d error [%d]: %s\n"</span> i e m) failed_rows<br>
}<br>
];<br>
</code><pre></pre><br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_execute_update"></a><a href="code_VALOcci.occi_execute_update.html">occi_execute_update</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -> <a href="Occi.html#TYPEparam_val">param_val</a> array -> int</code></pre><div class="info">
<code class="code">occi_execute_update stmt params <span class="keywordsign">-></span> num_rows</code> executes an INSERT/UPDATE/DELETE
operation on a previously bound statement
<p>
<b>Example:</b>
<p>
<pre></pre><code class="code"> occi_prepare_sql stmt <span class="string">"insert into test (id, name) values (:1, :2)"</span>;<br>
<br>
<span class="keyword">match</span> occi_execute_update stmt [| (1, <span class="constructor">Var_int</span> 1); (2, <span class="string">"test"</span>) |] <span class="keyword">with</span><br>
[ n <span class="keywordsign">-></span> <span class="constructor">Printf</span>.printf <span class="string">"Inserted %d record\n"</span> n];<br>
</code><pre></pre><br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_execute_plsql"></a><a href="code_VALOcci.occi_execute_plsql.html">occi_execute_plsql</a> : <code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a> -><br> (int * <a href="Occi.html#TYPEparam_val">param_val</a>) list -> (int * <a href="Occi.html#TYPEora_value">ora_value</a>) list</code></pre><div class="info">
<code class="code">occi_execute_plsql stmt params <span class="keywordsign">-></span> out_param_values</code> executes a PL/SQL block given
a list of bind parameter values and returns the list of OUT parameter tuples. In
the <code class="code">params</code> list, and <code class="code">out_param_values</code> list the first element represents the
position of the OUT parameter.<br>
<b>See also</b> <a href="#VALocci_prepare_plsql">occi_prepare_plsql for an example</a><br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
stmt</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEora_statement">ora_statement</a></code><br>
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
params</td>
<td align="center" valign="top">:</td>
<td><code class="type">(int * <a href="Occi.html#TYPEparam_val">param_val</a>) list</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALocci_commit"></a><a href="code_VALOcci.occi_commit.html">occi_commit</a> : <code class="type"><a href="Occi.html#TYPEora_connection">ora_connection</a> -> unit</code></pre><div class="info">
<code class="code">occi_commit con</code> commit a transaction<br>
</div>
<pre><span class="keyword">val</span> <a name="VALocci_rollback"></a><a href="code_VALOcci.occi_rollback.html">occi_rollback</a> : <code class="type"><a href="Occi.html#TYPEora_connection">ora_connection</a> -> unit</code></pre><div class="info">
<code class="code">occi_rollback con</code> rollback a transaction<br>
</div>
<pre><span class="keyword">val</span> <a name="VALdate_to_tm"></a><a href="code_VALOcci.date_to_tm.html">date_to_tm</a> : <code class="type">float -> Unix.tm</code></pre><div class="info">
<code class="code">date_to_tm float</code> convert a float date to a <code class="code"><span class="constructor">Unix</span>.tm</code> record.<br>
<b>Raises</b> <code>Failure</code> for other argument types.<br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
d</td>
<td align="center" valign="top">:</td>
<td><code class="type">float</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALdecode_date"></a><a href="code_VALOcci.decode_date.html">decode_date</a> : <code class="type">float -> int * int * int * int * int * int</code></pre><div class="info">
<code class="code">decode_date d</code> convert a date to a tuple
<code class="code">(year:int, mon:int, day:int, hour:int, min:int, sec:int)</code>.<br>
<b>Raises</b> <code>Failure</code> for other argument types.<br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
d</td>
<td align="center" valign="top">:</td>
<td><code class="type">float</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALencode_date"></a><a href="code_VALOcci.encode_date.html">encode_date</a> : <code class="type">int * int * int * int * int * int -> float</code></pre><div class="info">
<code class="code">encode_date date_tuple</code> converts a tuple from
<code class="code">(year, mon, day, hour, min, sec)</code> to a float value representing the
number of days since epoch and fractional part representing
the number of seconds since midnight. <code class="code">year</code> is the calendar year,
<code class="code">mon</code> is between <code class="code">1</code> and <code class="code">12</code>, <code class="code">day</code> is between <code class="code">1</code> and <code class="code">31</code>,
<code class="code">hour</code> is between <code class="code">0</code> and <code class="code">23</code>, and <code class="code">min</code> and <code class="code">sec</code> are between <code class="code">0</code> and
<code class="code">59</code>.<br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
(year,mon,day,hour,min,sec)</td>
<td align="center" valign="top">:</td>
<td><code class="type">int * int * int * int * int * int</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALdate_to_string"></a><a href="code_VALOcci.date_to_string.html">date_to_string</a> : <code class="type">float -> string</code></pre><div class="info">
<code class="code">date_to_string d</code> convert a date string in the "MM/DD/YYYY HH:MI:SS" format.
Failure is raised for other argument types.<br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
d</td>
<td align="center" valign="top">:</td>
<td><code class="type">float</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALsysdate"></a><a href="code_VALOcci.sysdate.html">sysdate</a> : <code class="type">unit -> float</code></pre><div class="info">
<code class="code">sysdate</code> returns the current local time encoded in the internal date format.<br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
()</td>
<td align="center" valign="top">:</td>
<td><code class="type">unit</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALfield_to_string"></a><a href="code_VALOcci.field_to_string.html">field_to_string</a> : <code class="type"><a href="Occi.html#TYPEora_value">ora_value</a> -> string</code></pre><div class="info">
<code class="code">field_to_string fld</code> convert an ora_value to string.
<p>
<b>Example:</b> <pre></pre><code class="code"> field_to_string(<span class="constructor">Date</span> d) <span class="keywordsign">-></span> <span class="string">"2006/03/10 15:00:00"</span> </code><pre></pre><br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
fld</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEora_value">ora_value</a></code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALprint_date"></a><a href="code_VALOcci.print_date.html">print_date</a> : <code class="type">float -> unit</code></pre><div class="info">
Print a date in the format returned by the <code class="code">date_to_string</code> function<br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
d</td>
<td align="center" valign="top">:</td>
<td><code class="type">float</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALprint_field"></a><a href="code_VALOcci.print_field.html">print_field</a> : <code class="type">int -> <a href="Occi.html#TYPEora_value">ora_value</a> -> unit</code></pre><div class="info">
Print a field. If <code class="code">n</code> is greater than 0, a comma will be printed in
front of the field's value<br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
n</td>
<td align="center" valign="top">:</td>
<td><code class="type">int</code><br>
</tr>
<tr>
<td align="center" valign="top" width="15%" class="code">
fld</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEora_value">ora_value</a></code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<pre><span class="keyword">val</span> <a name="VALprint_record"></a><a href="code_VALOcci.print_record.html">print_record</a> : <code class="type"><a href="Occi.html#TYPEora_value">ora_value</a> array -> unit</code></pre><div class="info">
Print a record containing <code class="code">ora_value</code> fields separated by commas.<br>
</div>
<div class="param_info"><table border="0" cellpadding="3" width="100%">
<tr>
<td align="left" valign="top" width="1%"><b>Parameters: </b></td>
<td>
<table class="paramstable">
<tr>
<td align="center" valign="top" width="15%" class="code">
r</td>
<td align="center" valign="top">:</td>
<td><code class="type"><a href="Occi.html#TYPEora_value">ora_value</a> array</code><br>
</tr>
</table>
</td>
</tr>
</table></div>
<br>
<a name="3_ObjectOrientedAPI"></a>
<h3>Object-Oriented API</h3><br>
<pre><span class="keyword">class</span> <a name="TYPEstatement"></a><a href="Occi.statement.html">statement</a> : <code class="type">?sql:string -> <a href="Occi.html#TYPEora_connection">ora_connection</a> -> </code><code class="code"><span class="keyword">object</span></code> <a href="Occi.statement.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info">
This class implements DML and DDL Oracle operations on a given
connection descriptor.
</div>
<pre><span class="keyword">class</span> <a name="TYPEconnection"></a><a href="Occi.connection.html">connection</a> : <code class="type">string -> string -> string -> </code><code class="code"><span class="keyword">object</span></code> <a href="Occi.connection.html">..</a> <code class="code"><span class="keyword">end</span></code></pre></body></html>