我如何从mariadb中的函数调用存储过程?

时间:2019-01-18 08:58:39

标签: mariadb

我想获取表中存在的行数,这些行数是我在运行时传递给函数的。

我已经创建了执行动态查询的过程和功能。函数将不允许动态查询,因为我正在从函数中调用过程。 该过程具有动态查询。

////////过程///////

data.columns = data.columns.map(serm.get)
df = data.sum(level=0, axis=1)

//////功能//////

CREATE PROCEDURE bizopsgolddev.`test1`(tbnm varchar(100))
begin
 declare sql_text varchar(200); 
 DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
                SELECT CONCAT(sql_text, ' is not valid');
        END;
        set sql_text=concat('select count(*) from ',tbnm);
        SET @SQL := sql_text;
        PREPARE stmt FROM @SQL;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
end;

如果我执行此// select xyz('axpdc')//应该返回行数

谁能告诉我如何通过将表名传递给函数来获得计数(仅适用于mariadb)

1 个答案:

答案 0 :(得分:0)

据我了解的问题,解决方案将是一个 function ,该函数返回表的行计数,并将其名称作为参数传递给该函数。

我认为可以通过查询MariaDB中的information_schema数据库来完成。一个函数可能看起来像这样:

CREATE DEFINER = 'yourUsername'@'192.168.%'
FUNCTION testDataBase.fn_GetRowCount(tableName VARCHAR(128))
  RETURNS int(11)
BEGIN

  -- This could be a parameter if need it to be.
  DECLARE databaseName varchar(40) DEFAULT 'testDataBase'; 
  DECLARE result int DEFAULT -1;

  SELECT t.TABLE_ROWS INTO result
    FROM information_schema.TABLES t
    WHERE t.TABLE_NAME = tableName
    AND t.TABLE_SCHEMA = databaseName;

  RETURN result;
END

为使其正常工作,被称为 definer 的用户必须对TABLES数据库中的information_schema表具有读取特权,否则您可能< / em>出现错误(tbh,我不知道是否有必要)。

information_schema数据库中有很多有用的信息。