Manuale PHP
Indietro |  | Avanti

# XCV. Funzioni Oracle 8

# Introduzione

Queste funzioni permettono di accedere ai database Oracle9, Oracle8 e Oracle7. Usano la Oracle Call Interface (OCI).

Questa estensione è più flessibile della estensione precedente di Oracle. Supporta il binding di variabili PHP locali e globali ai segnaposto Oracle, ha pieno supporto di LOB, FILE e ROWID e permette di utilizzare variabili di definizione personalizzabili. Si raccomanda di utilizzare questa estensione al posto della vecchia estensione quando possibile;

# Requisiti

Occorre avere installate le librerie client di Oracle per utilizzare questa estensione. Gli utenti Windows necessitano almeno della versione 8.1 di Oracle per utilizzare la dll `php_oci8.dll`.

Prima di usare questa estensione, occorre sincerarsi di aver impostato le variabili d'ambiente per l'utente Oracle, come pure per l'utente del server web. Le variabili che potrebbero necessitare l'impostazione sono le seguenti:

- ORACLE_HOME

- ORACLE_SID

- LD_PRELOAD

- LD_LIBRARY_PATH

- NLS_LANG

- ORA_NLS33

Dopo aver impostato le variabili d'ambiente per l'utente del server web, occorre sicerarsi di aver aggiunto anche l'utente stesso (nobody, www) al gruppo oracle.

> Se il server web non parte o va in blocco: Controllare che apache sia linkato con la libreria pthread:

>     # ldd /www/apache/bin/httpd
>         libpthread.so.0 => /lib/libpthread.so.0 (0x4001c000)
>         libm.so.6 => /lib/libm.so.6 (0x4002f000)
>         libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004c000)
>         libdl.so.2 => /lib/libdl.so.2 (0x4007a000)
>         libc.so.6 => /lib/libc.so.6 (0x4007e000)
>         /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

> Se la libpthread non compare nell'elenco, occorre reinstallare Apache:

>     # cd /usr/src/apache_1.3.xx
>     # make clean
>     # LIBS=-lpthread ./config.status
>     # make
>     # make install

> Si noti che su alcuni sistemi, come ad esempio UnixWare, la libreria si chiama libthread invece di libpthread. PHP e Apache devono essere configurati con EXTRA_LIBS=-lthread.

# Installazione

Si deve compilare PHP con l'opzione --with-oci8[=DIR], dove DIR è di default il contenuto della variabile di ambiente ORACLE_HOME.

# Configurazione di Runtime

Questa estensione non definisce alcuna direttiva di configurazione in `php.ini`

# Tipi di risorse

# Costanti predefinite

Queste costanti sono definite da questa estensione e sono disponibili solo se l'estensione è stata compilata nel PHP o se è stata caricata dinamicamente a runtime.

`OCI_DEFAULT` (integer)

  Modalità di esecuzione dello statement. Non viene eseguito il commit automatico utilizzando questa modalità.

`OCI_DESCRIBE_ONLY` (integer)

  Modalità di esecuzione dello statement. Utilizzare questa modalità se non si vuole eseguire la query, ma solamente ricevere la descrizione della select list.

`OCI_COMMIT_ON_SUCCESS` (integer)

  Modalità di esecuzione dello statement. Vene eseguito automaticamente il commit dello statement dopo la chiamata della oci_execute().

`OCI_EXACT_FETCH` (integer)

  Modalità di recupero dati dello statement. Utilizzato quando l'applicazione conosce in anticipo quante righe verranno recuperate. Questa modalità disattiva il prefetching negli Oracle release 8 o successivi. Il cursore viene eliminato dopo che le sono state caricate e ciò può determinare un utilizzo ridotto delle risorse del server.

`OCI_SYSDATE` (integer)

`OCI_B_BFILE` (integer)

  Utilizzato con oci_bind_by_name() quando si collegano i BFILE.

`OCI_B_CFILEE` (integer)

  Utilizzato con oci_bind_by_name() quando si collegano i CFILE.

`OCI_B_CLOB` (integer)

  Utilizzato con oci_bind_by_name() quando si collegano i CLOB.

`OCI_B_BLOB` (integer)

  Utilizzato con oci_bind_by_name() quando si collegano i BLOB.

`OCI_B_ROWID` (integer)

  Utilizzato con oci_bind_by_name() quando si collegano i ROWID.

`OCI_B_CURSOR` (integer)

  Utilizzato con oci_bind_by_name() quando si collegano i cursori, precedentemente allocati con oci_new_descriptor().

`OCI_B_NTY` (integer)

  Utilizzato con oci_bind_by_name() quando si collegano i named data type.

`OCI_B_BIN` (integer)

`SQLT_BFILEE` (integer)

  Alias di `OCI_B_BFILE`.

`SQLT_CFILEE` (integer)

  Alias di `OCI_B_CFILEE`.

`SQLT_CLOB` (integer)

  Alias di `OCI_B_CLOB`.

`SQLT_BLOB` (integer)

  Alias di `OCI_B_BLOB`.

`SQLT_RDD` (integer)

  Alias di `OCI_B_ROWID`.

`SQLT_NTY` (integer)

  Alias di `OCI_B_NTY`.

`OCI_FETCHSTATEMENT_BY_COLUMN` (integer)

  Modalità di default di oci_fetch_all().

`OCI_FETCHSTATEMENT_BY_ROW` (integer)

  Modalità alternativa di oci_fetch_all().

`OCI_ASSOC` (integer)

  Utilizzato con oci_fetch_all() e oci_fetch_array() per ottenere un array associative come risultato.

`OCI_NUM` (integer)

  Utilizzato con oci_fetch_all() e oci_fetch_array() per ottenere un array enumerativo come risultato.

`OCI_BOTH` (integer)

  Utilizzato con oci_fetch_all() e oci_fetch_array() per ottenere un array con indici sia associativi che numerici.

`OCI_RETURN_NULLS` (integer)

  Utilizzato con oci_fetch_array() per ottenere elementi dell'array vuoti se il valore del campo è `NULL`.

`OCI_RETURN_LOBS` (integer)

  Utilizzato con oci_fetch_array() per ottenere il valore del LOB invece del suo descrittore.

`OCI_DTYPE_FILE` (integer)

  Questo flag ordina a oci_new_descriptor() di inizializzare un nuovo descrittore di FILE.

`OCI_DTYPE_LOB` (integer)

  Questo flag ordina a oci_new_descriptor() di inizializzare un nuovo descrittore di LOB.

`OCI_DTYPE_ROWID` (integer)

  Questo flag ordina a oci_new_descriptor() di inizializzare un nuovo descrittore di ROWID.

`OCI_D_FILE` (integer)

  Alias di `OCI_DTYPE_FILE`.

`OCI_D_LOB` (integer)

  Alias di `OCI_DTYPE_LOB`.

`OCI_D_ROWID` (integer)

  Alias di `OCI_DTYPE_ROWID`.

# Esempi

Esempio 1. Trucchi OCI

`<?php
// by sergo at bacup dot ru
// Usare l'opzione OCI_DEFAULT nel comando execute per ritardare l'esicuzione
OCIExecute($stmt, OCI_DEFAULT);
// per ricevere i dati utilizzare (dopo il fetch):
$result = OCIResult($stmt, $n);
if (is_object($result)) $result = $result->load();
// come comandi INSERT o UPDATE usare:
$sql = "insert into table (field1, field2) values (field1 = 'value',
field2 = empty_clob()) returning field2 into :field2";
OCIParse($conn, $sql);
$clob = OCINewDescriptor($conn, OCI_D_LOB);
OCIBindByName($stmt, ":field2", &$clob, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT);
$clob->save("some text");
OCICommit($conn);
?>`

You can easily access stored procedures in the same way as you would from the commands line.

Esempio 2. Using Stored Procedures

`<?php
// by webmaster at remoterealty dot com
$sth = OCIParse($dbh, "begin sp_newaddress( :address_id, '$firstname',
'$lastname', '$company', '$address1', '$address2', '$city', '$state',
'$postalcode', '$country', :error_code );end;");
// Questo codice richiama la stored procedure sp_newaddress, dove :address_id è
// una variabile in/out e :error_code è una variabile out.
// Quindi si effettua il binding:
OCIBindByName($sth, ":address_id", $addr_id, 10);
OCIBindByName($sth, ":error_code", $errorcode, 10);
OCIExecute($sth);
?>`

Indietro | Partenza | Avanti
overload | Risali | OCI-Collection->append