当前位置: 首页 > 知识库问答 >
问题:

在存储过程中使用游标循环行

穆俊名
2023-03-14

场景:我有一个存储过程,它基于两个输入从表中获取数据:一个日期和一个字符串(这是一个列名)。第一个过程是从另一个过程调用的,该过程使用光标循环表中的行,并将每一行传递给第一个过程的字符串(要检查的列名)。我对第二个过程(即直接调用的过程)的输入是日期。

问题:当我单独调用它时,我的第一个过程运行良好。我的第二个过程是抛出一些我不知道如何修复的语法错误。

Obs:我已经在这里检查了关于这个主题的一些其他答案,比如在存储过程的循环中使用游标,以及如何在表的所有行中循环?(MySQL)。实际上,我的第二个过程现在是我在SE上找到的查询的修改版本https://dba.stackexchange.com/questions/138549/mysql-loop-through-a-table-running-a-stored-procedure-on-each-entry

问题:目前,代码在我的@colval声明的第5行抛出了一个错误。

代码:

-- Procedure for looping through rows of `wanted_columns` table:
delimiter $$
drop procedure if exists `data_check_loop` $$
create procedure `data_check_loop`(`wanted_date` date)
begin

set @dateval = `wanted_date`;
declare colval string default null;

-- boolean variable to indicate cursor is out of data
declare done tinyint default false;

-- declare a cursor to select the desired columns from the desired source table
declare cursor1
    cursor for
        select t1.c1
        from `wanted_columns` t1; 

-- catch exceptions
        declare continue handler for not found set done = true;

-- open the cursor
        open cursor1;
            my_loop: 
            loop
                fetch next from cursor1 into colval;
                if done then 
                    leave my_loop; 
                else  
                    call `set_column_stats`(colval, dateval);
                end if;
            end loop;
        close cursor1;

end $$
delimiter ;

问题:关于如何解决这个问题有什么想法吗?

共有1个答案

闻人志
2023-03-14

你在手术过程中有几个问题。首先,如手册所述:

仅允许在开始内进行声明。。。结束复合语句,并且必须在其开始处,在任何其他语句之前。

所以你需要移动你的

set @dateval = `wanted_date`;

在所有的DECLARE之后(包括游标和继续处理程序)。

其次,您对colval的声明不正确,string不是有效的数据类型,应替换为text

declare colval text default null;
 类似资料:
  • 本文向大家介绍Mysql存储过程循环内嵌套使用游标示例代码,包括了Mysql存储过程循环内嵌套使用游标示例代码的使用技巧和注意事项,需要的朋友参考一下

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • 问题内容: 请解释一下如何在oracle中使用游标进行循环。 如果我使用下一个代码,一切都很好。 但是,如果我为此sql语句定义变量,它将无法正常工作。 错误:PLS-00103 问题答案: 要解决与第二种方法相关的问题,您需要使用 游标变量和打开游标并获取数据的显式方式。它不是 允许在循环中使用游标变量: 了解更多

  • 问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。

  • 问题内容: 由于某些奇怪的原因,我无法从Python测试应用程序中的callproc调用中获得结果。MqSQL 5.2.47中的存储过程如下所示: 现在,在Python 3.3中使用PyCharm时,在调用此存储过程时似乎什么也找不到。这段代码为我提供了预期的结果: 但是这段代码带有cursor.fetchall()或cursor.fetchone()… …返回“ mysql.connector.

  • 问题内容: 我的数据库中有两个表 优惠券表 id (int) Name (nvarchar(max)) NoofUses (int) 优惠券使用表 id(int) Couponid(int) CreateDate(datetime) 每当用户单击优惠券时,都会在表中输入包含该优惠券ID的条目 现在,表中有一列称为。我想在存储过程中编写一个游标,该存储过程遍历表并查看一张优惠券有多少行,并将该数字填