【问题标题】:Stored procedure not giving the results of multiple out parameters存储过程不给出多个输出参数的结果
【发布时间】:2017-04-23 06:38:25
【问题描述】:

我不擅长编写存储过程。请帮我解决这个问题。我使用 mysql 工作台。我创建了存储过程来获得两个带有两个选择语句的输出。但它只给出了一个选择语句的输出,该语句最后写入存储过程。以下是过程。

  CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(IN date_x DATE,   OUT emplist3 varchar(200), OUT emplist4 varchar(200))
  BEGIN
  select employee.name as emplist3
  from employee
  where employee.id IN (
    select emp_position.employee_id
    from emp_position
    where emp_position.employee_id NOT IN (
       select emp_event.employee_id
       from emp_event
       where emp_event.date = date_x
    )
    AND emp_position.position = "Cameraman"
   );

  select employee.name as emplist4
  from employee
  where employee.id IN (
     select emp_position.employee_id
     from emp_position
     where emp_position.employee_id NOT IN (
        select emp_event.employee_id
        from emp_event
        where emp_event.date = date_x
     )
     AND emp_position.position = "Camera_Assistant"
     );
    END

请帮助我从上述过程中获得 emplist3 和 emplist4 的结果。 谢谢你。

【问题讨论】:

  • 你应该使用内连接而不是 in 和左连接而不是 not in 以获得更好的性能,更好的 sql 查询
  • @AnkitAgrawal 我不擅长写这个数据库的东西。你能用你的解决方案编辑我的代码吗?
  • 您发布的程序看起来应该可以工作。您能否编辑您的问题以包含调用它的代码(包括变量定义)、代码的实际输出以及在 mysqlworkbench 中运行时选择语句按预期工作的确认。如果您可以发布很好的示例数据,
  • 您需要选择进入,检查我的答案,看看它是否有效

标签: mysql stored-procedures


【解决方案1】:

您需要 Select into 这两个参数,因为这就是 out 参数的用途。

您还需要确保返回值是标量,

您不能在 out 参数中返回整个结果集。

使用输出参数的主要好处是您可以在返回之前对过程中的数据进行一些操作, 如果您不打算这样做和/或您可能返回多行,那么您就不能真正使用 out 参数。

此外,您还没有更改代码中的分隔符,您需要更改存储过程中的分隔符,以便 MYSQL 将整个过程视为代码块。

试试这个: 分隔符 // 创建过程 new_procedure(date_x DATE,OUT emplist3 varchar(200), OUT emplist4 varchar(200) )

BEGIN
      select employee.name INTO emplist3
      from employee
      where employee.id IN (
          select emp_position.employee_id
          from emp_position
          where emp_position.employee_id NOT IN (
              select emp_event.employee_id
              from emp_event
              where emp_event.date = date_x
          )
      AND emp_position.position = "Cameraman"
      );

     select employee.name INTO emplist4
     from employee
     where employee.id IN (
         select emp_position.employee_id
         from emp_position
         where emp_position.employee_id NOT IN (
             select emp_event.employee_id
             from emp_event
             where emp_event.date = date_x
         )
     AND emp_position.position = "Camera_Assistant"
     );
END //
DELIMITER ;

创建过程后,您需要在参数上调用 select 语句,如下所示:

SELECT @emplist3,@emplist4;

或者如果您稍后调用该过程:

CALL new_procedure(@myout1,@myout2);
SELECT @myout1,@myout2;

【讨论】:

    【解决方案2】:

    下面的例子可以根据自己的需要进行调整和修改。

    mysql> DELIMITER //
    
    mysql> DROP PROCEDURE IF EXISTS `new_procedure`//
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(
        ->   IN `date_x` DATE,
        ->   OUT `emplist3` VARCHAR(200),
        ->   OUT `emplist4` VARCHAR(200)
        -> )
        -> BEGIN
        ->   SELECT 'EMPLOYEE.NAME 1' INTO `emplist3`
        ->   FROM DUAL
        ->   WHERE `date_x` = `date_x`;
        -> 
        ->   SELECT 'EMPLOYEE.NAME 2' INTO `emplist4`
        ->   FROM DUAL
        ->   WHERE `date_x` = `date_x`;
        -> END//
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> DELIMITER ;
    
    mysql> SET @`NAME1` := NULL,
        ->     @`NAME2` := NULL;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CALL `new_procedure`(DATE('2000-01-01'), @`NAME1`, @`NAME2`);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT @`NAME1`, @`NAME2`;
    +-----------------+-----------------+
    | @`NAME1`        | @`NAME2`        |
    +-----------------+-----------------+
    | EMPLOYEE.NAME 1 | EMPLOYEE.NAME 2 |
    +-----------------+-----------------+
    1 row in set (0.00 sec)
    

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 2019-11-08
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多