查询结果为空,输出变量正确

Posted

技术标签:

【中文标题】查询结果为空,输出变量正确【英文标题】:Query results are empty, output variable is correct 【发布时间】:2018-08-19 23:19:11 【问题描述】:

我正在创建一个存储过程(例程),它从表中选择多个字段,然后设置一个检查/输出变量。

根据我的数据库中的数据,检查/输出变量设置为被要求的数据,但我的查询没有返回任何实际数据:

CREATE DEFINER=`odcorg_darrmik`@`%` PROCEDURE `sp_Get_Specific_Load`(
IN LOAD_ID INT,
OUT SUCCESS BIT)
BEGIN
set SUCCESS = 0;
SELECT 
       LOAD_ID,
       DRIVER_ID,
       BOL_NUMBER,
       MILES,
       LOAD_PAY,
       SURCHARGE,
       TARP_FEE,
       DESCRIPTION,
       WEIGHT, 
       TRUCK_NUMBER,
       TRAILER_NUMBER, 
       HAZARDOUS, 
       DATE_RECEIVED, 
       DATE_DISPATCHED,
       DATE_DUE, 
       DATE_DELIVERED,
       BROKER_COMPANY,
       BROKER_NAME,
       TIME_APPOINTMENT,
       TIME_ARRIVED,
       TIME_STARTED,
       TIME_FINISHED,
       FCFS,
       COMPLETE,
       PAID_COMPANY,
       PAID_DRIVER,
       (SELECT NAME FROM customers inner join loads_info on loads_info.LOAD_ID = @LOAD_ID and customers.CUSTOMER_ID = loads_info.SHIPPER_ID) AS SHIPPER_NAME,
       SHIPPER_ID,
       (SELECT NAME FROM customers INNER JOIN loads_info ON loads_info.LOAD_ID = @LOAD_ID AND customers.CUSTOMER_ID = loads_info.CONSIGNEE_ID) AS CONSIGNEE_NAME,
       CONSIGNEE_ID,
       (SELECT FIRST_NAME + ' ' + LAST_NAME FROM employee inner join loads_info on loads_info.LOAD_ID = @LOAD_ID and EMPLOYEE_ID = DRIVER_ID) AS DRIVER_NAME, 
       (SELECT SIGNED_BOL FROM loads_documents INNER JOIN loads_info ON loads_info.LOAD_ID = @LOAD_ID and loads_documents.LOAD_ID = @LOAD_ID) AS SIGNED_BOL
FROM loads_info WHERE LOAD_ID = @LOAD_ID;
set SUCCESS = 1;
END

我已经从查询中删除了大部分内容:

CREATE PROCEDURE sp_Get_Specific_Load(
IN LOAD_ID INT,
OUT SUCCESS BIT)
BEGIN
set SUCCESS = 0;
SELECT * FROM loads_info;
set SUCCESS = 1;
END

上述过程将再次返回 SUCCESS 输出,但不会从

SELECT * FROM loads_info;

如果我删除所有内容,只留下

SELECT * FROM loads_info;

该过程将返回数据...如果我添加一个 WHERE 子句(对上面非常简单的查询)我再次没有数据...所有字段标题但没有数据。

我对 mysql 很陌生...我将这个过程从我在 MSSQL 中编写的一个按预期运行的过程转换为返回请求的数据和检查/输出变量。

我做错了什么??

【问题讨论】:

【参考方案1】:

您需要查看的是您对变量的使用。首先要注意的是,WHERE 子句中的 @LOAD_ID 不是您调用过程时使用的 LOAD_ID,如下例所示。 @LOAD_ID 是一个完全独立的变量,因为它从未设置为任何值,所以它的值为 NULL。因此,WHERE 子句正在测试 LOAD_ID = NULL,它永远不会为真,因此不会返回任何行。

mysql> CREATE PROCEDURE `sp_Get_Specific_Load`(IN LOAD_ID INT, OUT SUCCESS BIT)
    -> BEGIN
    -> set SUCCESS = 0;
    -> SELECT LOAD_ID, @LOAD_ID;
    -> set SUCCESS = 1;
    -> END //

mysql> SET @SUCCESS = 0;
mysql> CALL `sp_Get_Specific_Load` (999, @SUCCESS);
+---------+----------+
| LOAD_ID | @LOAD_ID |
+---------+----------+
|     999 | NULL     |
+---------+----------+
1 row in set (0.01 sec)

mysql> SELECT @SUCCESS;
+----------+
| @SUCCESS |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

要避免的第二件事是使用与列名匹配的参数名。如果您使用相同的名称,MySQL 会选择输入参数而不是列名。正如下一个示例所示,它将选择参数,有效地针对自身测试参数值(每行都为真)。因此,您需要重命名输入参数以区分两者。

mysql> CREATE TABLE LOADS_INFO (
    ->   LOAD_ID INT
    -> );  
mysql> INSERT INTO LOADS_INFO (LOAD_ID) VALUES (1),(2),(3),(4),(5),(999);

mysql> CREATE PROCEDURE `sp_Get_Specific_Load`(IN LOAD_ID INT, OUT SUCCESS BIT)
    -> BEGIN
    -> set SUCCESS = 0;
    -> SELECT * FROM LOADS_INFO WHERE LOAD_ID = LOAD_ID;
    -> set SUCCESS = 1;
    -> END //

-- Matches ALL records with input of 999
mysql> CALL `sp_Get_Specific_Load` (999, @SUCCESS);
+---------+
| LOAD_ID |
+---------+
|       1 |
|       2 |
|       3 |
|       4 |
|       5 |
|     999 |
+---------+
6 rows in set (0.00 sec)

【讨论】:

那太愚蠢了...我使用参数@LOAD_ID 从 MSSQL 中的一个工作过程转换了这个例程。 MySQL 抱怨 @ 而我完全错过了使用同一个变量。 不要为此自责,这些问题在 *** 上经常出现。

以上是关于查询结果为空,输出变量正确的主要内容,如果未能解决你的问题,请参考以下文章

访问查询 - 如果字段为空不输出?

makefile变量的四种赋值方式

shell 脚本 变量 获取程序输出结果异常分析

为啥使用python查询数据库数据没有返回也没有报错

My SQL 动态查询执行并将输出输出到存储过程中的变量中

将 BQ 查询的输出分配给变量