使用 postgresql 数据库的某些 dbms 检索的结果集与 php 或 python 结果集不匹配

Result set retrieved with some dbms of postgresql database does not match with php or python result set

提问人:Alfonso Hernandez Xochipa 提问时间:3/24/2021 最后编辑:Alfonso Hernandez Xochipa 更新时间:3/24/2021 访问量:63

问:

我有一个奇怪的问题

我正在使用 postgresql 数据库,所以我创建了一个函数,该函数返回包含以下数据的查询。

DBMS 的结果集

当我想从编程语言中检索数据时,php或python,一些行和单元格被更改了。

下图是用 php 编写的 'var_dump' 语句,可以看到第一个数据与 dbms 的结果不相等

结果集的 PHP 中的“var_dump”语句

现在下图是用 python 编写的“print”语句,我使用相同的参数调用了相同的函数,并且发生相同的情况

结果集的 Python 中的“print”语句

例如,我有一行包含以下数据 这是 dbms DBeaver 7.3.3 和 AquaDataStudio 18.0.18 检索的数据示例。 检查用 * 括起来的值

Ac Diseño Y Maquinados S.A. De C.V. ADM120725CE8    **20105.00**    **170684.94**   

现在,当我从某种编程语言中获取值时,结果如下

Ac Diseño Y Maquinados S.A. De C.V. ADM120725CE8    **297488.33** **171968.47** 

代码如下

返回结果集的函数的代码

返回 DBMS 的此结果集

create or replace function fn_reporte_cfdis(p_fecha_desde varchar,p_fecha_hasta varchar)
    returns table (
              razon_social varchar(254)
            , rfc varchar(254)
            , suma_emitidos NUMERIC
            , suma_recibidos NUMERIC
            , utilidad_fiscal NUMERIC
            , isr NUMERIC
            , ptu NUMERIC
            , dividendos NUMERIC
        ) language plpgsql
    as $$
        begin
            return query 
                SELECT 
                    CI.SNOMBRE RAZON_SOCIAL,
                    CI.SRFC RFC,
                    coalesce(TO_NUMBER(TO_CHAR(EMITIDOS.TOTAL,'99G999G999D99'),'99G999G999D99'),0) SUMA_EMITIDOS,
                    coalesce(TO_NUMBER(TO_CHAR(RECIBIDOS.TOTAL,'99G999G999D99'),'99G999G999D99'),0)SUMA_RECIBIDOS,
                    coalesce(TO_NUMBER(TO_CHAR((EMITIDOS.TOTAL - RECIBIDOS.TOTAL),'99G999G999D99'),'99G999G999D99'),0) UTILIDAD_FISCAL,
                    coalesce(TO_NUMBER(TO_CHAR(((EMITIDOS.TOTAL - RECIBIDOS.TOTAL)*0.30),'99G999G999D99'),'99G999G999D99'),0) ISR,
                    coalesce(TO_NUMBER(TO_CHAR(((EMITIDOS.TOTAL - RECIBIDOS.TOTAL)*0.10),'99G999G999D99'),'99G999G999D99'),0) PTU,
                    coalesce(TO_NUMBER(TO_CHAR(((EMITIDOS.TOTAL - RECIBIDOS.TOTAL)*0.10),'99G999G999D99'),'99G999G999D99'),0) DIVIDENDOS
                FROM 
                    CLIENTES_IR CI
                LEFT JOIN 
                    (SELECT
                        CI.SRFC,
                        SUM(COALESCE(CS.SUBTOTAL,0)) AS TOTAL
                    FROM 
                        CLIENTES_IR CI 
                    LEFT JOIN 
                        CFDIS_SAT CS 
                    ON 
                        CS.RFCEMISOR = CI.SRFC
                    WHERE 
                        CS.TIPO = 'I' AND 
                        CS.RFCEMISOR = CI.SRFC AND
                        CS.FHEMISION BETWEEN to_date(p_fecha_desde,'DD-MM-YYYY') AND to_date(p_fecha_hasta,'DD-MM-YYYY')
                    GROUP BY CI.SRFC ) EMITIDOS ON CI.SRFC = EMITIDOS.SRFC
                LEFT JOIN
                    (SELECT
                        CI.SRFC,
                        SUM(COALESCE(CS.SUBTOTAL,0)) + COALESCE(EMITIDOS_NOMINA.SUBTOTAL,0) AS TOTAL
                    FROM 
                        CFDIS_SAT CS 
                    INNER JOIN 
                        CLIENTES_IR CI ON CS.RFCRECEPTOR = CI.SRFC
                    LEFT JOIN 
                        (SELECT
                            CI.SRFC,
                            SUM(COALESCE(CS.SUBTOTAL,0)) AS SUBTOTAL
                        FROM 
                             CFDIS_SAT CS
                        INNER JOIN CLIENTES_IR CI ON CS.RFCEMISOR = CI.SRFC
                        WHERE 
                            CS.TIPO = 'N' AND 
                            CS.FHEMISION BETWEEN to_date(p_fecha_desde,'DD-MM-YYYY') AND to_date(p_fecha_hasta,'DD-MM-YYYY')
                    GROUP BY CI.SRFC ) EMITIDOS_NOMINA ON CI.SRFC = EMITIDOS_NOMINA.SRFC
                WHERE 
                    CS.TIPO ='I' AND 
                    (CS.USOCFDI = 'G01' OR CS.USOCFDI = 'G03') AND
                    CS.FHEMISION BETWEEN to_date(p_fecha_desde,'DD-MM-YYYY') AND to_date(p_fecha_hasta,'DD-MM-YYYY')
                    GROUP BY CI.SRFC , EMITIDOS_NOMINA.SUBTOTAL) RECIBIDOS ON RECIBIDOS.SRFC    =   CI.SRFC;
        end;$$

php 中连接到数据库并调用函数的模型类的代码

class ReporteCfdisModel
{
    private $connection;
    private $queryData;

    public function __construct()
    {
        $this->connection = Connection::get()->connection(); //Get the connection of a class, is a tipical connection with pg_connect()
        $this->queryData = IniUtils::getUtils("application", "QUERY"); // get data of .ini file (Not relevant for this case)
    }

    public function getAll()
    {
        try {

            $stmt = pg_prepare($this->connection, "get_all", "select * from fn_reporte_cfdis($1,$2)"); // Prepare the query
            $stmt = pg_execute($this->connection, "get_all", array("01-02-2021", "28-02-2021")); // execute the query and pass parameters
            
            var_dump(pg_fetch_all($stmt)); // The line that Shows in the second image.
            // return pg_fetch_all($stmt);
        } catch (\Exception $ex) {
            echo json_encode(new Response(500, $ex->getMessage(), ""), JSON_PRETTY_PRINT);
        } finally {
            $stmt = null;
            $this->connection = null;
        }
    }
}

这是数据库连接的代码

class Connection
{
    private $configData;
    private $host;
    private $dbName;
    private $user;
    private $password;
    private $port;
    private static $instance = NULL;
    public $connectionData;
    public function __construct()
    {
        $this->configData = IniUtils::getUtils("application", "DB_PGSQL");

        if ($this->configData !== null || count($this->configData) > 0) {
            $this->host = $this->configData["db_host"];
            $this->dbName = $this->configData["db_name"];
            $this->user = $this->configData["db_user"];
            $this->password = $this->configData["db_password"];
            $this->port = $this->configData["db_port"];
        }
    }

    public static function get()
    {
        if (self::$instance === NULL) {
            self::$instance = new Connection();
        }
        return self::$instance;
    }

    public function connection()
    {
        try {
            // $this->connectionData = new PDO('pgsql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbName, $this->user, $this->password);
            $strHost = 'host=' . $this->host . ' port=' . $this->port . ' dbname=' . $this->dbName . " user=" . $this->user . " password=" . $this->password;
            $this->connectionData = pg_connect($strHost);
        } catch (\Exception $ex) {
            echo $ex->getMessage();
        }
        return $this->connectionData;
    }
}

这些都是重要的代码来构建逻辑。


发生了什么?我不知道当我使用 dbms 调用查询或函数时会发生什么,以及为什么此数据与某些编程语言中的结果集调用不匹配。

请帮帮我!

php postgresql 匹配 结果集 fetchall

评论

0赞 Tangentially Perpendicular 3/24/2021
您已经发布了大量结果的屏幕截图,但没有代码。有些不对劲,但我们无法知道是什么。将代码(而不是屏幕截图)发布到问题中。在此过程中,将相关结果数据发布到问题中,而不是屏幕截图中。请让我们轻松一点!
0赞 Alfonso Hernandez Xochipa 3/24/2021
@TangentiallyPerpendicular 感谢您的回答,我添加了重要的代码。

答: 暂无答案