有没有办法在存储过程中传递默认整数?
Is there any way to have a default integer passed inside a stored procedure?
对于我的家庭作业,存储过程应接受 1 到 15 之间的可选整数,但如果未传递任何值,则默认为 3。
DELIMITER //
CREATE OR REPLACE PROCEDURE rankVideos(rank INT)
BEGIN
if rank = null then
SET rank = 3;
END if;
CREATE OR REPLACE TEMPORARY TABLE all_ranks AS (
SELECT * FROM youtube.homework7a
);
create OR REPLACE TEMPORARY TABLE t2 AS ( SELECT
category,
row_number() OVER (ORDER BY cnt DESC) v_cnt,
row_number() OVER (ORDER BY views DESC) v_views,
row_number() OVER (ORDER BY likes DESC) v_likes,
row_number() OVER (ORDER BY dislikes DESC) v_dislikes,
row_number() OVER (ORDER BY comment_count DESC) v_comment_count FROM all_ranks
);
CREATE OR REPLACE TEMPORARY TABLE t3 AS (
SELECT * FROM t2
WHERE v_cnt <= rank OR v_views <= rank OR v_likes <= rank
OR v_dislikes < rank OR v_comment_count <= rank
);
CREATE OR replace TEMPORARY TABLE t4 AS (
SELECT category,
case when v_cnt <= rank then v_cnt ELSE null END cnt,
case when v_views <= rank then v_views ELSE null END views,
case when v_likes <= rank then v_likes ELSE null END likes,
case when v_dislikes <= rank then v_dislikes ELSE null END dislikes,
case when v_comment_count <= rank then v_comment_count ELSE null END comment_count
FROM t3
)
;
SELECT *,
ifnull(cnt,999)
+ ifnull(views,999)
+ ifnull(likes,999)
+ ifnull(dislikes,999)
+ifnull(comment_count,999) num_non_null_cols,
ifnull(cnt,0)
+ ifnull(views,0)
+ ifnull(likes,0)
+ ifnull(dislikes,0)
+ ifnull(comment_count,0) sum_non_null_cols
FROM t4
ORDER BY num_non_null_cols, sum_non_null_cols;
END
//
DELIMITER ;
当我 运行 程序并将整数留空时,我得到一个错误,它有一个不正确的整数值。
SQL
女士SQL
创建过程 MyProc
@rank int = 3
作为
...
开始
如果您传入一个值,它将使用该值。如果不传值,@rank = 3.
你展示的语法让我觉得你在使用 MySQL 或 MariaDB。
这些实现不支持过程参数默认值的功能。这已在 MySQL 中提出要求:https://bugs.mysql.com/bug.php?id=15975 但到目前为止,还不支持。
您正在使用我所知道的最佳解决方法,将参数设置为您的默认值(如果它为 NULL)。
另一种编码方式是使用 COALESCE() 函数:
SET rank = COALESCE(rank, 3);
这只是另一种实现与您的 IF/THEN 代码相同的方法。
对于我的家庭作业,存储过程应接受 1 到 15 之间的可选整数,但如果未传递任何值,则默认为 3。
DELIMITER //
CREATE OR REPLACE PROCEDURE rankVideos(rank INT)
BEGIN
if rank = null then
SET rank = 3;
END if;
CREATE OR REPLACE TEMPORARY TABLE all_ranks AS (
SELECT * FROM youtube.homework7a
);
create OR REPLACE TEMPORARY TABLE t2 AS ( SELECT
category,
row_number() OVER (ORDER BY cnt DESC) v_cnt,
row_number() OVER (ORDER BY views DESC) v_views,
row_number() OVER (ORDER BY likes DESC) v_likes,
row_number() OVER (ORDER BY dislikes DESC) v_dislikes,
row_number() OVER (ORDER BY comment_count DESC) v_comment_count FROM all_ranks
);
CREATE OR REPLACE TEMPORARY TABLE t3 AS (
SELECT * FROM t2
WHERE v_cnt <= rank OR v_views <= rank OR v_likes <= rank
OR v_dislikes < rank OR v_comment_count <= rank
);
CREATE OR replace TEMPORARY TABLE t4 AS (
SELECT category,
case when v_cnt <= rank then v_cnt ELSE null END cnt,
case when v_views <= rank then v_views ELSE null END views,
case when v_likes <= rank then v_likes ELSE null END likes,
case when v_dislikes <= rank then v_dislikes ELSE null END dislikes,
case when v_comment_count <= rank then v_comment_count ELSE null END comment_count
FROM t3
)
;
SELECT *,
ifnull(cnt,999)
+ ifnull(views,999)
+ ifnull(likes,999)
+ ifnull(dislikes,999)
+ifnull(comment_count,999) num_non_null_cols,
ifnull(cnt,0)
+ ifnull(views,0)
+ ifnull(likes,0)
+ ifnull(dislikes,0)
+ ifnull(comment_count,0) sum_non_null_cols
FROM t4
ORDER BY num_non_null_cols, sum_non_null_cols;
END
//
DELIMITER ;
当我 运行 程序并将整数留空时,我得到一个错误,它有一个不正确的整数值。
SQL 女士SQL
创建过程 MyProc @rank int = 3 作为 ... 开始
如果您传入一个值,它将使用该值。如果不传值,@rank = 3.
你展示的语法让我觉得你在使用 MySQL 或 MariaDB。
这些实现不支持过程参数默认值的功能。这已在 MySQL 中提出要求:https://bugs.mysql.com/bug.php?id=15975 但到目前为止,还不支持。
您正在使用我所知道的最佳解决方法,将参数设置为您的默认值(如果它为 NULL)。
另一种编码方式是使用 COALESCE() 函数:
SET rank = COALESCE(rank, 3);
这只是另一种实现与您的 IF/THEN 代码相同的方法。