tipi di dati oracle

Ciao a tutti,

  volevo sapere se qualcuno conosce come, dato un db oracle, settare la giusta corrispondenza tra i tipi di dati tra quelli del db e dell'arrray corrispondente in php. il problema, per esempio, mi si pone nell'uso ho dellle stringhe numeriche...

Grazie

Andrea

inviato 9 anni fa
cybaSsh
X 0 X

Potresti descrivere più nel dettaglio il problema?

Il problema avviene nell'inserimento o nell'estrazione dei dati?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

ok.

Il problema è di dire se ho un a tabella che mi da nel desc,

CAMPO          TIPO ORACLE               TIPO PHP
campo 1        NUMBER(x)          ->      number
campo 2        VARCHAR2(Y)      ->      String
campo 3        BOOL                  ->      bool
campo 4        DATE                   ->      strftime("%d-%b-%y",$data)
campo  5       TIMESTAMP         ->      etc. etc.

Cioè riesca a dare la giusta corrispondenza di tipo di dato da Oracle su una variabile array in php(dove di solito le funzioni oci vanno ad agire):

$campo_1=905

$campo_2='Ratman'

etc. etc.

Nella fattispecie mi si pone il problema quando ho una stringa numerica-ES.-  "05968".la funzione di controllo is_numeric mi da true.

Visto che creo una array, che sarà un attributo privato di un oggetto, in maniera dinamica indipendentemente dalle dimensioni e i contenuti (ma questo è un altro argomento)mi sarebbe piaciuto che quando trova un numerico, metta il valore tipo number, quando trova un varchar2, mi metta un valore di tipo stringa. etc....

Spero di essere stato chiaro.

Ciao

Andrea

risposto 9 anni fa
cybaSsh
X 0 X

Domanda cruciale: perché ti stai preoccupando della corrispondeza dei tipi? PHP è un linguaggio "dinamico", il tipo di una variabile viene definito e persino campiato a runtime. Nella maggior parte dei casi non c'è nessun bisogno di preoccuparsi sul tipo di dato che PHP avrà associato ad una variabile (o ad un elemento di un array).

Il PHP effettua una gran quantità di cast impliciti durante l'esecuzione degli script per cui non serve preoccuparsi (in generale) di cosa stia accadendo dietro le quinte.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

ok, ma il problema mi vien fuori quando devo ad andare a creare (sempre dinamicamente) le query da dar in pasto ad Oracle. Devo sapere se il campo è stringa o numerico...questione di apici. Sapendo a priori la struttura della tabella, staticamente mi adatto... ma se volessi far una superclasse che mi si specializzasse in base al tipo di tabella che incontra, me lo inibisce....

Ciao

Andrea

risposto 9 anni fa
cybaSsh
X 0 X

Per decidere se mettere gli apici o meno ti basta un controllo con la funzione is_numeric. Sbaglio?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Gia, ma il problema mi si pone quando prendo dei valori varchar2 che sono numeri, come ad esempio '054768' mi diventa 54768 o "84.173" me lo prende come numero decimale. Questo avviene anche se in fase di assegnazione iniziale :

$this->campi['TERMINALE']="84.173";

if (is_numeric($this->campi['TERMINALE'])){   //VERA
   echo "espressione vera<br />";  //
}
//MA ANCHE

if (is_string($this->campi['TERMINALE'])){   //VERA
   echo "espressione vera<br />";
}

vorrei che non me li trattasse come numeri sempre, ma mantenesse la sua origine tipo di dato.

risposto 9 anni fa
cybaSsh
X 0 X

...non so se son stato molto chiaro... cmq credo di aver risolto utilizzando il cast sul tipo in questo modo:

$this->campi['numerogenerico']=(int)array[$i];
//$i indica la posizione in un array generica, l'array è quello associato ad una base di dati oracle.

ora mi distingue tra numeri e stringhe numeriche...peccato non posso farlo a monte...

sicuramente ci sarà qlc di più elegante ed efficiente...

Saluti

Andrea

risposto 9 anni fa
cybaSsh
X 0 X

Visto che stai cercando di costrire una classe "general purpose" potresti desumere il tipo di dati direttamente interpellando Oracle, con la funzione oci_field_type().

http://it2.php.net/manual/en/function.oci-field-type.php

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

grazie. lo proverò subito.

Andrea

risposto 9 anni fa
cybaSsh
X 0 X

un ultima cosa a riguardo... per avere una DESC della tabella ho visto che non si può usare una queri del tipo DESC NOME_TABELLA

l'unica cosa che mi è venuta in mente è il seguente codice:

$desc_qry="SELECT * FROM NOME_TABELLA WHERE CAMPO_UNIVOCO=$X";//$X e' un qualsiasi valore

$stm_desc=oci_parse($conn,$desc_qry);
if (!stm_desc){
   echo "errore nella definizione della query<br />";
   $e=oci_error();
   print_r($e);
}

$ris=oci_execute($stm_desc);
if (!$ris){
   echo "errore nell'esecuzione della query<br />";
   $e = oci_error($stm_desc); // For oci_execute errors pass the statementhandle
   echo htmlentities($e['message']);
   echo "<pre>";
   echo htmlentities($e['sqltext']);
   printf("\n%".($e['offset']+1)."s", "^");
   echo "</pre>";
} else {
   $ncols=oci_num_fields($stm_desc);
   $valori=oci_fetch_array($stm_desc);
   for ($i = 1; $i <= $ncols; $i++) {
       $column_name  = oci_field_name($stm_desc, $i);
       $column_type  = oci_field_type($stm_desc, $i);
       $column_size  = oci_field_size($stm_desc, $i);
       echo "$column_name = ";
       echo "$column_type(";
       echo "$column_size)  ";
   }
}

ma questo  a diversi limiti, c'è qualcosa che mi potrebbe aiutare per ottenere una descrizione della tabella?

risposto 9 anni fa
cybaSsh
X 0 X

Potresti provare con una query equivalente, come suggerito qui:

http://www.ss64.com/ora/desc.html

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

volevo inoltre dire che la funzione oci_field_size,  mi sembra che non funziona correttamnete, quando trova un number(x) o number(x,y): mi mette il valore di default 22. possibile?

Andrea

risposto 9 anni fa
cybaSsh
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda