将准备好的语句与游标一起使用

用户名

我将游标声明放入准备好的语句中,然后执行它,然后返回一个 error #1324 - Undefined CURSOR: getid.

我该如何解决这个问题?

定界符;; 

如果存在test2,则丢弃程序;

创建过程test2(table_id VARCHAR(25))
BEGIN 
    DECLARE完成INT DEFAULT FALSE; 
    DECLARE ID INT;
    DECLARE id_new INT; 
    声明stmt1 VARCHAR(1024); 
    声明stmt2 VARCHAR(1024); 
    未找到的DECLARE继续处理程序已完成= 1; 

    SET @ sqltext1:= CONCAT('DECLARE getid CURSOR FOR SELECT entryId FROM',table_id,'ORDER BY entryId'); 
    从@ sqltext1准备stmt1; 
    执行stmt1; 

    SET @id_new = 1; 

    OPEN getid; 

    将getid抓取到id中;
    重复
        使用@new_id,id执行stmt2; 
        SET @ sqltext2:= CONCAT('UPDATE',table_id,'SET entryId =?WHERE entryId =?');
        从@ sqltext2准备stmt2; 
        SET @id_new = @id_new +1; 
        将getid抓取到id中;
    直到完成END REPEAT;
    CLOSE getid; 
结束
;; 

呼叫test2('Test');
拉文德·雷迪

一些规则:

  1. 所有声明必须顺序排列在一个位置。
  2. 您不能在游标声明中使用变量名
  3. 处理程序声明必须在游标声明之后。
  4. 您不能将局部变量名称(id)用作已准备好的语句的绑定参数。您只能使用session变量(例如@_id)。

为了克服这些问题,您可以采用以下解决方案。

  1. 使用SP的输入参数定义一个临时表。
  2. 现在,在同一表上声明游标并使用它。
  3. 删除创建的临时表。

以下示例应适用于您的表。

delimiter $$

drop procedure if exists test2$$

create procedure test2( table_id varchar(25) )
begin
  set @temp_query = 'drop temporary table if exists temp_cursor_table';
  prepare pst from @temp_query;
  execute pst;
  drop prepare pst; -- or
  -- deallocate prepare pst;

  set @temp_table_query='create temporary table temp_cursor_table ';
  set @temp_table_query=concat( @temp_table_query, ' select entryId from ' );
  set @temp_table_query=concat( @temp_table_query, table_id );
  set @temp_table_query=concat( @temp_table_query, ' order by entryId' );

  prepare pst from @temp_table_query;
  execute pst;
  drop prepare pst;

  -- now write your actual cursor and update statements
  -- in a separate block
  begin
    declare done int default false;
    declare id int;
    declare id_new int;
    declare stmt1 varchar(1024);
    declare stmt2 varchar(1024);

    declare getid cursor for  
              select entryId from temp_cursor_table order by entryId;
    declare continue handler for not found set done = 1;

    set @id_new = 1; 

    open getid;
    fetch getid into id;
    repeat
      set @sqltext2 := concat( 'update ', table_id );
      set @sqltext2 := concat( @sqltext2, ' set entryId = ? where entryId = ?' );
      set @_id = id;
      prepare stmt2 from @sqltext2;
      execute stmt2 using @new_id, @_id;
      set @id_new = @id_new + 1;
      fetch getid into id;
    until done end repeat;
    close getid;
  end;
end;
$$

delimiter ;

现在,使用table_id调用该过程

call test2( 'Test' );

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将准备好的语句与JDBCTemplate一起使用

如何将准备好的语句与OleDbDataAdapter一起使用?

将 PDO 准备好的语句与 MySQL 查询变量一起使用

准备好的语句executeUpdate无法与更新语句一起使用

将 PDO 与准备好的语句一起使用并在 foreach 内部执行时如何以 smarty 显示数据?

PHP password_verify 无法与准备好的语句一起使用

是否可以创建一个准备好的语句,并在以后在postgres下与Java一起使用?

Apache Nifi是否已准备好在生产中与Kubernetes一起使用?

如何使用 MySQLi 和准备好的语句将一行选择导出到 JSON

MySQL存储过程游标的准备好的语句

使用准备好的语句写入 mysql

Sqlx使用准备好的语句获取

使用准备好的语句将一个月中的某几天插入数据库中

检测文件流已完成并准备好与 avplayer 一起玩

提取准备好的语句

mysql准备好的语句我应该使用哪条语句

在 Java 中使用准备好的语句更改语句

PHP将条件追加到准备好的语句

将 Oracle upsert 转换为 PostgreSQL 准备好的语句

将超时置于准备好的语句上

准备好的语句将列设置为空

将数组插入PostgreSQL映射准备好的语句

将动态SQL修复为准备好的语句

将PDO准备好的语句传递给变量

使用准备好的语句将空值插入数据库PHP MYSQL

如何使用sqlite_bind_text将文本正确绑定到SQLite准备好的语句

无法使用准备好的语句将json对象插入mysql(无需安装即可)

如何使用准备好的语句将UUID插入MYSQL表Binary(16)

使用准备好的语句将登录测试信息检索到$ row参数