mysql存储过程 将传入的参数用作为表名 执行时提示错误 Table 'asteriskcdrdb.tbname' doesn't exist

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql存储过程 将传入的参数用作为表名 执行时提示错误 Table 'asteriskcdrdb.tbname' doesn't exist相关的知识,希望对你有一定的参考价值。

DELIMITER $$

CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(in tbname varchar(22))
BEGIN
declare sExten char(10);
declare inCallnum int;
declare inCallsec int;
declare outCallnum int;
declare outCallsec int;
declare Extens char(10);
declare done int default 0;

declare cur3 cursor for SELECT DISTINCT (case when LENGTH(src)=3 then src else dst end ) as exten from tbname;

declare continue handler for sqlstate '02000' set done = 1;

open cur3;
repeat
fetch cur3 into Extens;
if not done THEN
SELECT ‘a’,'bbb';
#insert into outtbname (`extension`) values(hrtimes);
end if;
until done end repeat;
close cur3;

END$$
DELIMITER ;

mysql 使用游标时,暂不支持动态sql语句的游标。
建议你先把拼接的sql语句 create table newtable select * from 表
然后在游标中用 from newtable,最后关闭游标后,再drop 这个newtable。

如:

declare stmt varchar(8000);
SET @SQL = Concat("create table newtable SELECT DISTINCT (case when LENGTH(src)=3 then src else dst end ) as exten from ", tbname );
prepare stmt from @SQL;
execute stmt;
deallocate prepare stmt;

declare cur3 cursor for SELECT exten from newtable;追问

我是需要将它select出来的结果再去查询其它的表,得出结果时就插入一表中。过程为
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(in tbname varchar(22),in outtbname varchar(22));
open cur3;
repeat
fetch cur3 into Extens;
if not done THEN
insert into outtbname (`extension`) select src,'bbb' from outtbname where src=Extens;
end if;

追答

你这个 都不正确的。 mysql中 不可以直接使用 变量作为表名的。

你在 declare cur3 cursor for SELECT 。。。 from tbname ,你通过传入的参数作为 表名,但mysql在实际执行中 把 参数 tbname 作为实际存在的表名来执行查询的,故 tbname 是不存在的。
同理, 你 insert into 中的 outtbname 也是作为参数的,但 执行是 mysql当做表名的,而不是拼出来的 动态sql执行的。

参考技术A 那你首先检查下是否有这个表呢?你的程序是否在使用这个asteriskcdrdb数据库?追问

我有asteriskcdrdb这个库的。就算输入的参数为任意字符时。过程执行还是提示Table 'asteriskcdrdb.tbname' doesn't exist。就是说tbname它不能接收参数作为表名

如何调用带参数的 MySQL 过程?

【中文标题】如何调用带参数的 MySQL 过程?【英文标题】:How do you call a MySQL procedure with parameters? 【发布时间】:2021-07-02 18:04:47 【问题描述】:

当我单击 winform 中的按钮时,我试图调用存储过程。存储过程有一个插入语句,其中值boardID = @newGameID

newGameID 引用了在我的 c# 代码中传入的值。作为测试,我将该值设为 1。这是我的存储过程:

delimiter //
create procedure loopData()
BEGIN
DECLARE i int DEFAULT 0;
WHILE i <= 62 DO
INSERT INTO tbl_tile (boardID) VALUES(@newGameID);
SET i = i + 1;
END WHILE;
END//
delimiter ;

这是我链接到按钮的 c# 代码:

private void Tile()

    var connectionString = "server=localhost;password=1234;user id=root;persistsecurityinfo=True;database=dat602_assessmentdb_m2"; 
    using (var connection = new MySqlConnection(connectionString))
    
        MySqlCommand command = new MySqlCommand("loopData", connection);
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddWithValue("newGameID", 1);
        command.Connection.Open();
        var result = command.ExecuteNonQuery();
        command.Connection.Close();
    


当我运行 winform 时,我得到这个错误:

我不确定我的结构是否正确,但我会认为当我执行command.Parameters.AddWithValue("newGameID", 1) 时,它会将存储过程中的参数值设置为 1。我该如何解决这个问题或者是否有解决这个问题的更好方法?

【问题讨论】:

欢迎来到 Stack Overflow!这是一个很好的问题,但与其发布指向错误屏幕截图的链接,不如将其转录到您的问题中。这使人们更容易阅读和回答您的问题 创建存储过程时不需要声明参数吗? CREATE PROCEDURE loopData(IN newGameId int) 抱歉@KevinWells,我需要 10 个代表才能插入图片 我试试@NicholasHunter 当我做delimiter // create procedure loopData(IN newGameId int) BEGIN DECLARE i int DEFAULT 0; WHILE i &lt;= 62 DO INSERT INTO tbl_tile (boardID) VALUES(@newGameID); SET i = i + 1; END WHILE; END// delimiter ;时它仍然返回相同的错误 【参考方案1】:

问题是你调用的sql存储过程,没有任何参数!存储过程确实在其主体中引用了 会话变量,但这不是您传递的 sql 语句的一部分。

您应该将存储过程更改为有一个参数,然后您可以按照您的方式传递它:

delimiter //
create procedure loopData(IN newGameID int)
    BEGIN
        DECLARE i int DEFAULT 0;
        WHILE i <= 62 DO
            INSERT INTO tbl_tile (boardID) VALUES(newGameID);
            SET i = i + 1;
        END WHILE;
    END//
delimiter ;

您现在可以使用您的 C# 代码将参数传递给您的存储过程。

警告:我的解决方案仅修复了问题中的错误消息!存储过程的主体对我来说没有太大意义,因为它试图将传递的值 63 次插入到 tbl_title 表中。如果此字段顾名思义是主键,那么每当您调用此存储过程时,您都会收到重复键错误。解决这个问题超出了这个问题的范围,因为没有信息应该如何工作,而且问题不是关于重复键错误。

【讨论】:

【参考方案2】:

试试这个:

command.Parameters.AddWithValue("@newGameID", 1)

【讨论】:

欢迎来到 Stack Overflow Eder。您能否通过描述您的代码应该做什么以及它如何回答问题来扩展这个答案? 试试这个方法,如果遇到同样的错误,检查你的SP字符串 Conn = "server=localhost;password=1234;user id=root;persistsecurityinfo=True;database=dat602_assessmentdb_m2" SqlConnection con =新的 SqlConnection(Conn);尝试 SqlCommand com = new SqlCommand("loopData", con); com.CommandType = CommandType.StoredProcedure; com.Parameters.AddWithValue("@newGameID", 1); con.Open(); com.ExecuteNonQuery(); 我试过了,但它仍然返回相同的错误。 SP 字符串是正确的,因为它已在其他地方使用过。如果我在数据库中将其设置为 1,则存储过程可以工作,但如果我想创建一个参数,它就不起作用 我的意思是当我执行INSERT INTO tbl_tile (boardID) VALUES(1); 时存储过程可以工作。但我希望 value 成为一个参数 当你创建你的过程时,你声明了@NewGameID??我的意思是这个创建过程 loopData @newGameID int AS BEGIN ... END【参考方案3】:

这对某人有帮助。

MySQL 程序:

CREATE PROCEDURE `bestSellingProducts`(IN startDate DATETIME, IN endDate DATETIME, IN nTop INT)
    BEGIN
    SELECT p.product_id, p.product_name, p.price
        FROM orders o 
        INNER JOIN order_items oi ON oi.order_id = o.order_id
        INNER JOIN products p ON p.product_id=oi.product_id
        WHERE (o.order_date BETWEEN startDate AND endDate)
        GROUP BY p.product_id
        ORDER BY quantitySold DESC
        LIMIT nTop;
    END

现在如何使用 C#/VB

command.CommandText = "dbname.bestSellingProducts"
command.Parameters.AddWithValue("@startDate", fromDate)
command.Parameters.AddWithValue("@endDate", toDate)
command.Parameters.AddWithValue("@nTop", 10)
command.CommandType = CommandType.StoredProcedure

注释。 对于此示例,fromDate 和 toDate 是 DateTime 类型。 打开连接时使用 Try/Catch 很好。

【讨论】:

【参考方案4】:

试试这个方法,如果你得到同样的错误,检查你的SP

        string Conn = "server=localhost;password=1234;user id=root;persistsecurityinfo=True;database=dat602_assessmentdb_m2"
        SqlConnection con = new SqlConnection(Conn);

        try
        
            SqlCommand com = new SqlCommand("loopData", con);
            com.CommandType = CommandType.StoredProcedure;
            com.Parameters.AddWithValue("@newGameID", 1);

            con.Open();
            com.ExecuteNonQuery();


        

【讨论】:

它说它需要一个捕获,因为你正在尝试 尝试 Catch(Ex) SqlConnection 和 SqlCommand 类用于 ms sql server。问题是关于mysql的。 老兄,同样的结构,只是声明com的时候把SQLCommand改成了MYSQLCommand。 老兄,即使那样也行不通。

以上是关于mysql存储过程 将传入的参数用作为表名 执行时提示错误 Table 'asteriskcdrdb.tbname' doesn't exist的主要内容,如果未能解决你的问题,请参考以下文章

mysql 动态传入表名参数的存储过程写法

mysql 存储过程 动态表名

mysql存储过程把字段作为传入参数

6Python全栈之路系列之MySQL存储过程

MySQL-存储过程动态执行sql

mysql 存储过程 数据库表名字段作为参数传递给存储过程的方法