如何在存储过程中执行存储的语句

时间:2019-01-30 00:40:45

标签: mysql stored-procedures

我正在mySQL中创建一个函数,该函数将在每次任何表插入或删除表时更新表指标。因此,我有了Table_metrics表,其中包含元素table_namerow_count

    CREATE TABLE Table_metrics (
        table_name VARCHAR(64), 
        row_count INTEGER DEFAULT 0 );

因此,只要将任何内容添加到数据库中我的任何表(此表除外)中,匹配的行都将使用该表中的行数进行更新。

为此,我尝试制作一个存储过程:

    CREATE PROCEDURE table_update_metric(IN tablename VARCHAR(64))
        UPDATE Table_metrics 
            SET row_count=(SELECT COUNT(*) FROM tablename) 
        WHERE table_name = tablename;

当我调用过程call table_update_metric('Owners');(所有者是我数据库中的表)时,这会产生错误

    table DB.tablename doesn't exist

我已经对存储过程进行了一些研究,试图弄清楚它们将如何工作。我认为问题出在“ SELECT COUNT(*)FROM tablename)行,因此我尝试在过程中使用存储语句:

    CREATE PROCEDURE table_update_metric(IN TABLENAME VARCHAR(64))
        SET @s = CONCAT('SELECT COUNT(*) FROM ', tablename)
        UPDATE Table_metrics 
            SET row_count=EXECUTE @s 
        WHERE table_name = tablename;

我不太确定如何正确地执行存储的语句,因为我对MySQL还是比较陌生的,但是我相信这是要走的路。

有人可以提供有关此问题的任何见解吗?

2 个答案:

答案 0 :(得分:0)

Mysql中已经提供了您要执行的操作。信息架构表为您存储此信息:)

 SELECT TABLE_NAME, TABLE_ROWS)
 FROM INFORMATION_SCHEMA.TABLES 
 WHERE TABLE_SCHEMA = '{your_db}';

答案 1 :(得分:0)

根据Somonare的说法,我在数据库中创建了一个使用该信息的表:

firewall-cmd --permanent --direct --remove-rule 'ipv4 filter OUTPUT 2 -o ens32 -p udp -m conntrack --ctstate NEW -j ACCEPT'

此表将在每次Sensor中的表更新时通过触发器进行更新。