कुछ नियम:
- सभी घोषणाएं एक क्रम में एक ही स्थान पर होनी चाहिए।
- आप कर्सर घोषणाओं में चर नामों का उपयोग नहीं कर सकते हैं .
- हैंडलर घोषणाएं कर्सर घोषणाओं के बाद होनी चाहिए।
- आप स्थानीय चर नामों का उपयोग नहीं कर सकते (
id
) तैयार बयानों के लिए बाध्य पैरामीटर के रूप में। आप केवलsession
का उपयोग कर सकते हैं चर (जैसे@_id
)।
ऐसी समस्याओं को दूर करने के लिए आप निम्न उपाय अपना सकते हैं।
- एसपी को इनपुट पैरामीटर का उपयोग करके एक अस्थायी तालिका को परिभाषित करें।
- अब उसी टेबल पर कर्सर डिक्लेयर करें और उसका इस्तेमाल करें।
- बनाई गई अस्थायी तालिका को छोड़ दें।
निम्नलिखित उदाहरण को आपकी टेबल पर काम करना चाहिए।
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' );