【问题标题】:How to execute a query which is stored in a table column MySQL?如何执行存储在 MySQL 表列中的查询?
【发布时间】:2017-10-03 18:55:18
【问题描述】:
mysql> select * from CT;

| CID | MID | REPORT_QUERY           |
|   1 |   1 | select * from emp;     |
|   2 |   2 | select * from student; |

2 rows in set (0.00 sec)

我想在REPORT_QUERY 列中执行查询。

DELIMITER //
 CREATE PROCEDURE TRYct()
   BEGIN
SET @str=(SELECT GROUP_CONCAT(REPORT_QUERY SEPARATOR ' ') FROM CT);
PREPARE q from @str;
EXECUTE q;
   END //
 DELIMITER ;

我使用此代码,但如果我的表中只有一个查询,它就可以工作。如果有两个查询比它给出一个错误。

ERROR 1064 (42000): 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 'select * from student' at line 1

问题出在哪里?帮帮我。

【问题讨论】:

  • 我不喜欢将 sql 存储在 sql 表中,但您尝试从 sql 存储过程运行此类查询对我来说似乎很奇怪。如果你把它保存在 sql 中,为什么不直接制作存储过程呢?如果没有,为什么不从客户端运行查询?

标签: mysql stored-procedures group-concat sql-server-group-concat


【解决方案1】:

如果你想执行存储在某个 MySQL 表的列中的 SQL,试试这个:

SELECT sql_text INTO @sql FROM sql_queries WHERE id = 1;
PREPARE sql_query FROM @sql;
EXECUTE sql_query;

表格内容sql_queries

+----+--------------+ |编号 | sql_text | +----+--------------+ | 1 |从公司中选择 *; | +----+--------------+

【讨论】:

    【解决方案2】:

    您可以使用游标获取CT 表上的每个REPORT_QUERY,并使用准备好的语句执行:

    delimiter $$
    drop procedure if exists run_queries$$
    create procedure run_queries()
    begin
    
        declare s_query varchar(255);
    
        declare done bool default false;
        declare c_queries cursor for    
            select REPORT_QUERY from CT;
        declare continue handler for not found set done = true;
    
    
        open c_queries;
        read_loop: loop
    
            fetch c_queries into s_query;
            if done then 
                leave read_loop;
            end if;
    
            -- run the query
            set @sql = s_query;
            prepare stmt from  @sql;
            execute stmt;
            deallocate prepare stmt;
        end loop;
    
    end$$
    

    创建过程后,可以如下调用:

    调用 run_queries();

    就是这样。

    【讨论】:

    • @Shoaeb 在这种情况下,我们可以使用另一种类型,例如 text 或者只是将大小增加到 1024....我不知道
    【解决方案3】:

    据我了解,您的问题是您需要运行存储在SQL 表单中的表列中的查询。

    在这里你可以从table column获取查询并在mysqli中执行。

    SQL 查询表图像在这里存储查询

    SQL 员工表 [在执行期间由查询表动态调用]

    PHP SQL 代码:`

    <?php
        $link = new mysqli ('localhost','root','admin','demo');
    
        if($link->connect_error){
            die ("Connection Failed".$link->connect_error);
        }
    
        //YOU NEED THIS AS YOU NEED TO ACCESS THE COLUMN DATA IN TABLE
        $sql = "SELECT * FROM querytable WHERE id=1";
    
        if($res = $link->query($sql)){
            //IF THE ROW EXISTS
            if($res->num_rows > 0){
                while($row = $res->fetch_assoc()){
    
                    $query = $row['report_query']; //HERE IS THE SQL QUERY STORED IN TABLE , WHICH IS STORED IN ANOTHER VARIABLE
                    $result = $link->query($query); // NOW EXECUTE THE QUERY
                    if($result->num_rows > 0){
                ?>
                        <table border="1" cellpadding="10">
                            <tr>
                                <th>First Name</th>
                                <th>Last Name</th>
                            </tr>
                <?php
                        while($rows = $result->fetch_assoc()){
                            //DISPLAY RESULTS HERE
                ?>          
                            <tr>
                                <td><?php echo $rows['first_name'];?></td>
                                <td><?php echo $rows['lastname'];?></td>
                            </tr>
                <?php
                        }
                ?>
                        </table>
            <?php
                    }
                }
            }   
        }
        else
        {
            echo $link->error;
        }
    ?>
    

    `

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      • 2020-01-11
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      相关资源
      最近更新 更多