PHP 7.1.21 Released

oci_field_scale

(PHP 5, PHP 7, PECL OCI8 >= 1.1.0)

oci_field_scaleLit l'échelle d'une colonne Oracle

Description

int oci_field_scale ( resource $statement , mixed $field )

Lit l'échelle d'une colonne Oracle.

Pour les colonnes de type FLOAT, la précision et non nulle, et l'échelle est de -127. Si la précision est 0, alors la colonne est de type NUMBER. Sinon, elle est de type NUMBER(precision, scale).

Liste de paramètres

statement

Un identifiant de requête OCI valide.

field

Peut être un index de champ (en commençant à 1) ou le nom d'un champ.

Valeurs de retour

Retourne l'échelle, sous la forme d'un entier, ou FALSE si une erreur survient.

Exemples

Exemple #1 Exemple avec oci_field_scale()

<?php

// Création de la table avec :
//   CREATE TABLE mytab (c1 NUMBER, c2 FLOAT, c3 NUMBER(4), c4 NUMBER(5,3));

$conn oci_connect("hr""hrpwd""localhost/XE");
if (!
$conn) {
    
$m oci_error();
    
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid oci_parse($conn"SELECT * FROM mytab");
oci_execute($stidOCI_DESCRIBE_ONLY); // Utilisation de OCI_DESCRIBE_ONLY si aucune ligne n'est récupérée

$ncols oci_num_fields($stid);
for (
$i 1$i <= $ncols$i++) {
    echo 
oci_field_name($stid$i) . " " 
        
oci_field_precision($stid$i) . " " 
        
oci_field_scale($stid$i) . "<br>\n";
}

// Affiche :
//   C1    0 -127
//   C2  126 -127
//   C3    4    0
//   C4    5    3

oci_free_statement($stid);
oci_close($conn);

?>

Notes

Note:

Dans les versions de PHP antérieures à la version 5.0.0, vous devez utiliser la fonction ocicolumnscale(). Cet ancien nom est toujours utilisable : un alias a été fait vers la fonction oci_field_scale(), pour assurer la compatibilité ascendante. Toutefois, il est recommandé de ne plus l'utiliser.

Voir aussi

add a note add a note

User Contributed Notes 1 note

up
0
VLroyrenn
4 months ago
If you're converting SQL values to their respective float and int values based on scale and precision like I am, there's a catch, here.

This is a slimmed-down version of the conversion logic I'm using :

<?php
$col
= [
   
'id' => $field_id,
   
'name' => oci_field_name($statement, $field_id),
   
'type' => oci_field_type($statement, $field_id),
   
'scale' => oci_field_scale($statement, $field_id);
   
'precision' => oci_field_precision($statement, $field_id);
]

$str_data = oci_result($statement, $field_id)

switch(
$col['type']) {
    case
'NUMBER':
        if (
$col['precision'] !== 0 && $col['scale'] === -127) {
           
// A binary float
           
$data = floatval($str_data);
        } else if(
$col['scale'] === 0) {
           
// An integer
           
$data = intval($str_data);
        } else {
           
// A fixed-point decimal number, which has no equivalent in PHP, so float
           
$data = floatval($str_data);
        }
       
        break;
   
    default:
       
$data = $str_data;
        break;
}

echo(
"{$col['name']} : $str_data ({$col['type']} ({$col['precision']}, {$col['scale']})) -> $data\n");
?>

What the doc doesn't say is that any number column that was defined without a scale parameter counts as a plain NUMBER(), which always has a precision of 0 and a scale of -127, so they get interpreted as floats even when they should be integers.

What the doc also doesn't say is that __all analytics functions that return numbers return a plain NUMBER()__, so something like COUNT(*), RANK() or FIRST_VALUE(foo) is still going to net you a float.

Be careful with these if you have any type-sensitive code that relies on those values (I'm personally very fond of using type-hinting and strict_types = 1).
To Top