PHP Conference Japan 2024

oci_field_scale

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

oci_field_scale取得欄位的比例

描述

oci_field_scale(resource $statement, string|int $column): int|false

傳回具有 column 索引之欄位的比例。

對於 FLOAT 欄位,精確度為非零值,比例為 -127。如果精確度為 0,則欄位為 NUMBER。否則為 NUMBER(精確度, 比例)。

參數

statement

有效的 OCI 陳述式識別符。

column

可以是欄位的索引(以 1 為基礎)或名稱。

傳回值

傳回比例(整數),失敗時傳回 false

範例

範例 #1 oci_field_scale() 範例

<?php

// 使用以下程式碼建立表格:
// 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($stid, OCI_DESCRIBE_ONLY); // 如果不提取資料列,請使用 OCI_DESCRIBE_ONLY

$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";
}

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

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

?>

參見

新增註解

使用者貢獻的註解 1 個註解

1
VLroyrenn
6 年前
如果您像我一樣,正在根據比例和精確度將 SQL 值轉換為它們各自的浮點數和整數值,這裡有一個陷阱。

這是我正在使用的轉換邏輯的精簡版本

<?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) {
// 二進位浮點數
$data = floatval($str_data);
} else if(
$col['scale'] === 0) {
// 整數
$data = intval($str_data);
} else {
// 固定小數點數,在 PHP 中沒有對應的表示法,因此使用浮點數
$data = floatval($str_data);
}

break;

default:
$data = $str_data;
break;
}

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

該文件沒有說明的是,任何未定義比例參數的數字欄位都會被視為一般的 NUMBER(),其精確度始終為 0,比例為 -127,因此即使它們應該是整數,也會被解譯為浮點數。

該文件也沒有說明的是,__所有傳回數字的分析函式都會傳回一般的 NUMBER()__,因此類似 COUNT(*)、RANK() 或 FIRST_VALUE(foo) 的函式仍然會得到浮點數。

如果您有任何依賴這些值的類型敏感程式碼(我個人非常喜歡使用類型提示和 strict_types = 1),請小心使用。
To Top