【问题标题】:How fetch column using mysql stored procedure by passing columnName dynamically如何通过动态传递 columnName 使用 mysql 存储过程获取列
【发布时间】:2018-08-22 00:28:16
【问题描述】:

下面是错误和存储过程,我有一个名为 dropdown 的表,它有两列,如 className 和主题我想要做的是当我抛出这些列名中的任何一个时,我需要获取该列数据。当我尝试创建以下程序时出现错误

错误

(0 row(s) affected)
(0 ms taken)

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@result;
    DECLARE @query;
    SET @result = '';
    SET @query = CONCAT('SELE' at line 8
(0 ms taken)

我的程序

DELIMITER $$;

DROP PROCEDURE IF EXISTS `testdb`.`getDropdown`$$

CREATE PROCEDURE `testdb`.`getDropdown` (in i_column_name varchar(250))
L_return:

BEGIN

    DECLARE sqlstate_code CHAR(5) DEFAULT '00000';
    DECLARE message_text TEXT;
    DECLARE mysql_errno INT;
    DECLARE status VARCHAR(10);
    DECLARE @result;
    DECLARE @query;
    SET @result = '';
    SET @query = CONCAT('SELECT ',in_columnName,' FROM test.dropdown');


    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN

        GET DIAGNOSTICS CONDITION 1
        sqlstate_code = RETURNED_SQLSTATE,
        mysql_errno = MYSQL_ERRNO,
        message_text = MESSAGE_TEXT;

        IF sqlstate_code <> '00000' THEN
    SET @status = 'FATAL';
    SELECT @status as status;
        SELECT CONCAT(mysql_errno,': ',message_text) as ErrorMsg, 'Our System is down. We are working on it. Please come back in few minutes' as UserMsg;
    END IF;
    END;

        PREPARE stmt FROM @query;
        EXECUTE stmt using @result;



    IF EXISTS(@result != '' OR @result IS NOT NULL)
        THEN 
    SET @status = 'TRUE';
        SELECT @status as status;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        LEAVE L_return;

    ELSE
    SET @status = 'FALSE';
        SELECT @status as status;     
        SELECT CONCAT('No data in test.dropdown table')as ErrorMsg, CONCAT('Our System is down. We are working on it. Please come back in few minutes') as UserMsg;
        LEAVE L_return;
       END IF;
  END$$

DELIMITER ;$$

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    准备动态查询的示例。希望对你有所帮助。

    您需要做的就是准备并执行一条语句。

    delimiter // 
    CREATE PROCEDURE dynamicQuery(IN TABLE_NAME VARCHAR(64), IN COL_NAME VARCHAR(64))
    BEGIN
        SET @q = CONCAT('SELECT ',COL_NAME,' FROM ',TABLE_NAME );
        PREPARE stmt FROM @q;
        EXECUTE stmt ;
        DEALLOCATE PREPARE stmt;
    END
    //
    delimiter ;
    

    将它应用到您的代码中,我没有采用整个 SP。刚刚参与了使用动态列的地方。

    DECLARE @res;
    DECLARE @q;
    
    SET @res = '';
    
    SET @q = CONCAT('SELECT ',in_columnName,' FROM test.dropdown');
    
    PREPARE stmt FROM @q;
    EXECUTE stmt using @res;
    DEALLOCATE PREPARE stmt;
    
    IF (@res != '' OR @res IS NOT NULL)
    THEN 
    SET @status = 'TRUE';
    SELECT @status as status;
    END IF;
    

    【讨论】:

    • @srinivasgowda 你问过这个问题吗?用户名令人困惑。你的代码是什么?
    • 参考你的建议,我已经尝试了上面的代码仍然给出错误
    • 查看我发布的问题
    • 将 TEXT 数据类型分配给 DECLARE @result;声明@查询;这两个变量以及您的输入参数具有“i_”并且您在联系功能中使用了不同的名称。更正它,如果有错误,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2017-04-03
    相关资源
    最近更新 更多