Server IP : 185.86.78.101 / Your IP : 216.73.216.124 Web Server : Apache System : Linux 675867-vds-valikoshka1996.gmhost.pp.ua 5.4.0-150-generic #167-Ubuntu SMP Mon May 15 17:35:05 UTC 2023 x86_64 User : www ( 1000) PHP Version : 7.4.33 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /www/server/mysql/mysql-test/t/ |
Upload File : |
# # Demonstrate how RESIGNAL can be used to 'catch' and 're-throw' an error # --disable_warnings drop database if exists demo; --enable_warnings create database demo; use demo; delimiter $$; create procedure proc_top_a(p1 integer) begin ## DECLARE CONTINUE HANDLER for SQLEXCEPTION, NOT FOUND begin end; select "Starting ..."; call proc_middle_a(p1); select "The end"; end $$ create procedure proc_middle_a(p1 integer) begin DECLARE l integer; # without RESIGNAL: # Should be: DECLARE EXIT HANDLER for SQLEXCEPTION, NOT FOUND DECLARE EXIT HANDLER for 1 /* not sure how to handle exceptions */ begin select "Oops ... now what ?"; end; select "In prod_middle()"; create temporary table t1(a integer, b integer); select GET_LOCK("user_mutex", 10) into l; insert into t1 set a = p1, b = p1; call proc_bottom_a(p1); select RELEASE_LOCK("user_mutex") into l; drop temporary table t1; end $$ create procedure proc_bottom_a(p1 integer) begin select "In proc_bottom()"; if (p1 = 1) then begin select "Doing something that works ..."; select * from t1; end; end if; if (p1 = 2) then begin select "Doing something that fail (simulate an error) ..."; drop table no_such_table; end; end if; if (p1 = 3) then begin select "Doing something that *SHOULD* works ..."; select * from t1; end; end if; end $$ delimiter ;$$ # # Code without RESIGNAL: # errors are apparent to the caller, # but there is no cleanup code, # so that the environment (get_lock(), temporary table) is polluted ... # call proc_top_a(1); # Expected --error ER_BAD_TABLE_ERROR call proc_top_a(2); # Dirty state --error ER_TABLE_EXISTS_ERROR call proc_top_a(3); # Dirty state --error ER_TABLE_EXISTS_ERROR call proc_top_a(1); drop temporary table if exists t1; delimiter $$; create procedure proc_top_b(p1 integer) begin select "Starting ..."; call proc_middle_b(p1); select "The end"; end $$ create procedure proc_middle_b(p1 integer) begin DECLARE l integer; DECLARE EXIT HANDLER for SQLEXCEPTION, NOT FOUND begin begin DECLARE CONTINUE HANDLER for SQLEXCEPTION, NOT FOUND begin /* Ignore errors from the cleanup code */ end; select "Doing cleanup !"; select RELEASE_LOCK("user_mutex") into l; drop temporary table t1; end; RESIGNAL; end; select "In prod_middle()"; create temporary table t1(a integer, b integer); select GET_LOCK("user_mutex", 10) into l; insert into t1 set a = p1, b = p1; call proc_bottom_b(p1); select RELEASE_LOCK("user_mutex") into l; drop temporary table t1; end $$ create procedure proc_bottom_b(p1 integer) begin select "In proc_bottom()"; if (p1 = 1) then begin select "Doing something that works ..."; select * from t1; end; end if; if (p1 = 2) then begin select "Doing something that fail (simulate an error) ..."; drop table no_such_table; end; end if; if (p1 = 3) then begin select "Doing something that *SHOULD* works ..."; select * from t1; end; end if; end $$ delimiter ;$$ # # Code with RESIGNAL: # errors are apparent to the caller, # the but cleanup code did get a chance to act ... # call proc_top_b(1); --error ER_BAD_TABLE_ERROR call proc_top_b(2); call proc_top_b(3); call proc_top_b(1); drop database demo;