mysql使用phpmyadmin在存储过程中调用函数
我有以下有效的代码:mysql使用phpmyadmin在存储过程中调用函数,mysql,stored-procedures,stored-functions,Mysql,Stored Procedures,Stored Functions,我有以下有效的代码: BEGIN DECLARE done INT DEFAULT FALSE; DECLARE user_id int(11); DECLARE cur1 CURSOR FOR SELECT id FROM users; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; # drop and re-create user_rank TABLE DROP TABLE IF EXISTS us
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE user_id int(11);
DECLARE cur1 CURSOR FOR SELECT id FROM users;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
# drop and re-create user_rank TABLE
DROP TABLE IF EXISTS user_rank;
CREATE TABLE `user_rank` (
`id` int(11) UNSIGNED NOT NULL,
`has_hobbies` int(3) DEFAULT 0,
`passed_test` int(3) DEFAULT 0,
`has_picture` int(3) DEFAULT 0,
`won_a_job` int(3) DEFAULT 0,
`is_prolancer` int(3) DEFAULT 0,
`is_verified` int(3) DEFAULT 0,
`has_portfolio` int(3) DEFAULT 0,
`has_likes` int(3) DEFAULT 0,
`has_disputes` int(3) DEFAULT 0,
`has-earnings` int(3) DEFAULT 0,
`has_feebacks` int(3) DEFAULT 0,
`has_invitations` int(3) DEFAULT 0,
`has_views` int(3) DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `user_rank`
ADD PRIMARY KEY (`id`);
ALTER TABLE `user_rank`
MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO user_id;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO user_rank (id) values (user_id);
END LOOP;
CLOSE cur1;
END
它使用游标在表用户内部循环,并将所有用户ID复制到表用户_列中。我在数据库中定义了一个名为“hasUserPassedTest”的函数,该函数的用户id返回10或0。我想调用上面循环中的函数,并将其插入user_rank表中,但以下代码不起作用:
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE user_id int(11);
DECLARE cur1 CURSOR FOR SELECT id FROM users;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
# drop and re-create user_rank TABLE
DROP TABLE IF EXISTS user_rank;
CREATE TABLE `user_rank` (
`id` int(11) UNSIGNED NOT NULL,
`has_hobbies` int(3) DEFAULT 0,
`passed_test` int(3) DEFAULT 0,
`has_picture` int(3) DEFAULT 0,
`won_a_job` int(3) DEFAULT 0,
`is_prolancer` int(3) DEFAULT 0,
`is_verified` int(3) DEFAULT 0,
`has_portfolio` int(3) DEFAULT 0,
`has_likes` int(3) DEFAULT 0,
`has_disputes` int(3) DEFAULT 0,
`has-earnings` int(3) DEFAULT 0,
`has_feebacks` int(3) DEFAULT 0,
`has_invitations` int(3) DEFAULT 0,
`has_views` int(3) DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `user_rank`
ADD PRIMARY KEY (`id`);
ALTER TABLE `user_rank`
MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO user_id;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO user_rank (id, has_hobbies) values (user_id, CALL
hasUserPassedTest(user_id));
END LOOP;
CLOSE cur1;
END
我正在使用CALL调用存储过程中的函数,但不起作用。如何在存储过程中调用函数
我正在使用CALL调用存储过程中的函数,但不起作用
调用
不用于执行函数
CALL语句调用先前使用CREATE procedure定义的存储过程
它使用游标在表用户内部循环,并将所有用户ID复制到表用户_列中 为什么这么复杂?过程、游标、处理程序、循环。。。一个简单的查询就足够了:
INSERT INTO user_rank (id, has_hobbies)
SELECT user_id, hasUserPassedTest(user_id)
FROM users;
更新 插入可与表格创建相结合:
CREATE TABLE `user_rank` (
`id` int(11) UNSIGNED NOT NULL,
`has_hobbies` int(3) DEFAULT 0,
`passed_test` int(3) DEFAULT 0,
`has_picture` int(3) DEFAULT 0,
`won_a_job` int(3) DEFAULT 0,
`is_prolancer` int(3) DEFAULT 0,
`is_verified` int(3) DEFAULT 0,
`has_portfolio` int(3) DEFAULT 0,
`has_likes` int(3) DEFAULT 0,
`has_disputes` int(3) DEFAULT 0,
`has-earnings` int(3) DEFAULT 0,
`has_feebacks` int(3) DEFAULT 0,
`has_invitations` int(3) DEFAULT 0,
`has_views` int(3) DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SELECT user_id AS id, hasUserPassedTest(user_id) AS has_hobbies
FROM users;
一个微妙之处是,插入的字段将是表结构中的最后一个字段。如果字段顺序合理,则必须在选择部分提及所有字段:
CREATE TABLE `user_rank` (
`id` int(11) UNSIGNED NOT NULL,
`has_hobbies` int(3) DEFAULT 0,
`passed_test` int(3) DEFAULT 0,
`has_picture` int(3) DEFAULT 0,
`won_a_job` int(3) DEFAULT 0,
`is_prolancer` int(3) DEFAULT 0,
`is_verified` int(3) DEFAULT 0,
`has_portfolio` int(3) DEFAULT 0,
`has_likes` int(3) DEFAULT 0,
`has_disputes` int(3) DEFAULT 0,
`has-earnings` int(3) DEFAULT 0,
`has_feebacks` int(3) DEFAULT 0,
`has_invitations` int(3) DEFAULT 0,
`has_views` int(3) DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SELECT user_id AS id,
hasUserPassedTest(user_id) AS has_hobbies
0 AS `passed_test`,
0 AS `has_picture`,
0 AS `won_a_job`,
0 AS `is_prolancer`,
0 AS `is_verified`,
0 AS `has_portfolio`,
0 AS `has_likes`,
0 AS `has_disputes`,
0 AS `has-earnings`,
0 AS `has_feebacks`,
0 AS `has_invitations`,
0 AS `has_views`
FROM users;
DROP TABLE
保留一个单独的查询:(哦,我的话,我让我的生活变得难以置信。谢谢你的回答。@Dino我会尽量简化你的生活……请参阅更新。Akina你是明星,我可以再问一个问题吗?我已经在用户排名中添加了一个“total”字段,其中total=通过测试+有图片+等等。我可以在上面的选择中这样做吗?或者我需要创建一个n在前面的语句之后是否更新user_rank?@Dino没有任何阻止。您可以将任何字段添加到表结构中,并将适当的字段或表达式添加到SELECT子句中。但是,如果可以从存储在其他字段中的其他值计算其值,则没有理由创建静态字段。只需创建total INT AS(已通过测试+已存储图片+…)并将其添加到结构中。不需要SELECT子句中的其他表达式。