我一直在试图找出我在beloe程序中做错了什么
CREATE PROCEDURE `example`(IN col_n char(50),IN p_cont char(50),IN p_ud int)
BEGIN
set @S = CONCAT('select rn.emp_id as emp_id,controller,perma,permb,permc,permd,order from emp n
join resource_emp rn on rn.emp_id = n.emp_id
join resource r on r.resource_id = rn.resource_id
join u_resource ur on ur.resource_id = r.resource_id
join user u on u.u_id = ur.ur_id
join(
select title,min(order) as pr from emp n
join resource_emp rn on rn.emp_id = n.emp_id
join resource r on r.resource_id = rn.resource_id
join u_resource ur on ur.resource_id = r.resource_id
join user u on u.u_id = ur.ur_id
where u.u_id = ',@p_ud,' group by title)a on a.title = n.title and a.pr = order
where u.u_id = ',@p_ud,' n.con = ''',@p_cont,''' and ,@col_n,' = 1
group by n.title order by n.order');
PREPARE stmt1 FROM @S;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END
我试图按照以下步骤执行,但出现错误
call hop_thlc_t.auth('perma', 'submit', 2);
错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便在' NULL'附近使用在第1行
当发生这种情况时,我仍然可以通过使用以下参数运行上述过程作为查询来执行相同的结果并获得所需的结果
set @col_n ='perma';
set @p_cont = 'submit' ;
set @p_ud =2;
感谢您解决问题的任何帮助
答案 0 :(得分:3)
正如Sami Kuhmonen在评论中所建议的那样,只需将@
作为过程参数的变量取消。
存储过程中的局部变量在名称前没有@
。如果您使用像@col_n
这样的变量,那么它与col_n
的变量不同,后者是您的过程参数的变量。
@
的变量称为Session Variables。它们具有存储过程之外的范围。您发现可以在调用过程之前设置该值。同样,如果在过程中设置此变量的值,则在过程返回后它仍将具有该值。
我在答案中发布了一个演示:https://stackoverflow.com/a/41925146/20860
不幸的是,每条规则都有例外。使用PREPARE
时,必须使用会话变量。本地变量不适用于PREPARE
。