【问题标题】:How to use a sub query as part of a stored procedure MySQL如何使用子查询作为存储过程 MySQL 的一部分
【发布时间】:2015-12-30 12:39:28
【问题描述】:

我正在尝试创建一个过程(在 phpMyAdmin 中称为例程)并且目前有这个查询:

BEGIN

INSERT INTO `users` (`username`, `password`, `email`, `user_role_id`,` date_registered`)
    VALUES (_username, _password, _email, (SELECT `ID` FROM `roles` WHERE `role_name` = _role) , _date);

END;

但这不起作用,我尝试将变量声明为 role_ID 并且这也不起作用,有人可以帮我解决这个问题吗?

注意

您看到的参数(以下划线 (_) 开头)都是 phpMyAdmin 例程创建器中使用的 IN 参数

编辑

我尝试过的其他代码是这样的:

BEGIN

DECLARE role_id AS/*=*/ (SELECT `ID` FROM `roles` WHERE `role_name` = _role); /* tried both AS and = */

INSERT INTO `users` (`username`, `password`, `email`, `user_role_id`, `date_registered`)
    VALUES (_username, _password, _email, role_id, _date);

END;

还注意到DECLARE有一个小错误,把上面的代码改成:

BEGIN

DECLARE @role_id ;
SET @role_id = (SELECT `ID` FROM `roles` WHERE `role_name` = _role);

INSERT INTO `users` (`username`, `password`, `email`, `user_role_id`, `date_registered`)
    VALUES (_username, _password, _email, @role_id, _date);

END;

但还是没有运气

【问题讨论】:

    标签: mysql stored-procedures phpmyadmin subquery routines


    【解决方案1】:
    USE [FydaDB]
    GO
    /****** Object:  StoredProcedure [dbo].[CountryManagerReport]    Script Date: 5/25/2018 2:12:42 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[CountryManagerReport] 
        @FromDate datetime,
        @Todate datetime,
        @countryId int
    AS
    BEGIN
    Select FirstName+ ' ' + MiddleName+ '' +  LastName as FullName ,Email,CNIC,((select CountryCode from Country where ID=FydaAdmin.CountryId)+ '-' +(select PhoneNo from Contacts where FydaAdminId=FydaAdmin.ID)) as Mobile,
    (ZipCode+ ' ,' +[Address]+ ' ,' + (select Name from City where ID=FydaAdmin.CityId )+ ', ' +(select Name from States where ID=FydaAdmin.StateId )+ ', ' +(select Name from Country where ID=FydaAdmin.CountryId)
     ) as [Address]
     from FydaAdmin where CreatedDateTime  BETWEEN  @FromDate  and @Todate or CountryId=@countryId 
    END
    

    【讨论】:

      【解决方案2】:

      我已经想出了如何做到这一点 - 虽然没有使用子查询,但我有这个存储过程:

      BEGIN
      
      INSERT INTO `users` (`username`, `password`, `email`, `user_role_ID`, `date_registered`)
          VALUES (username, pwd, email, role, datenow);
      
      END
      

      这个 PHP 函数和类来工作它:

      class create_user
      {
          public static function CreateUser($username, $password, $email, $role)
          {
              global $link;
              #region Get role id
              $role_q = "SELECT `ID` FROM `roles` WHERE `role_name` = '{$role}';";
              $role_rs = mysqli_fetch_row($link->query($role_q));
              $role = $role_rs[0];
              #endregion
      
              #region Create user
              $link->query("CALL sp_create_user('{$username}', '" . hash("sha256", $password) . "', '{$email}', '{$role}', '" . date("y-m-d H:i:s") . "')") ? $inserted = true : $inserted = false;
              #endregion
      
              #region check if user created
              if ($inserted)
              {
                  return true;
              }
              else
              {
                  return "User was not created. Either the username or email is already in use.";
              }
              #endregion
          }
      }
      

      如果有人可以使用子查询来做到这一点,那将是正确的答案,因为它有效,但不是我问题的完整答案。

      SQL 愉快!

      【讨论】:

        猜你喜欢
        • 2018-02-27
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多