Codebase list python-cx-oracle / 005d2b2b-d2b2-4638-886a-125d878e146a/main samples / ReturnNumbersAsDecimals.py
005d2b2b-d2b2-4638-886a-125d878e146a/main

Tree @005d2b2b-d2b2-4638-886a-125d878e146a/main (Download .tar.gz)

ReturnNumbersAsDecimals.py @005d2b2b-d2b2-4638-886a-125d878e146a/mainraw · history · blame

#------------------------------------------------------------------------------
# Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# ReturnNumbersAsDecimals.py
#   Returns all numbers as decimals by means of an output type handler. This is
# needed if the full decimal precision of Oracle numbers is required by the
# application. See this article
# (http://blog.reverberate.org/2016/02/06/floating-point-demystified-part2.html)
# for an explanation of why decimal numbers (like Oracle numbers) cannot be
# represented exactly by floating point numbers.
#
# This script requires cx_Oracle 5.0 and higher.
#------------------------------------------------------------------------------

from __future__ import print_function

import cx_Oracle
import decimal
import SampleEnv

def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
    if defaultType == cx_Oracle.NUMBER:
        return cursor.var(decimal.Decimal, arraysize = cursor.arraysize)

connection = cx_Oracle.connect(SampleEnv.GetMainConnectString())
connection.outputtypehandler = OutputTypeHandler
cursor = connection.cursor()
cursor.execute("select * from TestNumbers")
for row in cursor:
    print("Row:", row)