有没有办法在存储过程中传递一个默认整数?

Posted

技术标签:

【中文标题】有没有办法在存储过程中传递一个默认整数?【英文标题】:Is there any way to have a default integer passed inside a stored procedure? 【发布时间】:2020-08-12 22:34:03 【问题描述】:

对于我的家庭作业,存储过程应该接受一个介于 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 服务器?甲骨文? mysql if rank = null 应该是 if rank is null 这将范围缩小到 MariaDB、MySQL、MS SQL、PostgreSQL 和 SQLLite。请找出哪一个并相应地标记。它们都有不同的默认参数语法。 知道了,我相信我正在使用 MariaDB。 @camjace321 为了将来参考,您通常应该为 MariaDB 使用 mysql 标签,它是公共 MySQL 代码的一个分支。 【参考方案1】:

你展示的语法让我觉得你在使用 MySQL 或 MariaDB。

这些实现不支持过程参数默认值的功能。这个在 MySQL 中已经请求了:https://bugs.mysql.com/bug.php?id=15975 但是目前还不支持。

您正在使用我所知道的最佳解决方法,将参数设置为您的默认值(如果它为 NULL)。

另一种编码方式是使用COALESCE()函数:

SET rank = COALESCE(rank, 3);

这只是实现与 IF/THEN 代码相同的功能的另一种方式。

【讨论】:

【参考方案2】:

SQL 微软SQL

创建过程 MyProc @rank int = 3 作为 ... 去吧

如果您传入一个值,它将使用该值。如果不传入值,@rank = 3。

【讨论】:

以上是关于有没有办法在存储过程中传递一个默认整数?的主要内容,如果未能解决你的问题,请参考以下文章

存储过程禁止空参数

存储过程返回2个结果数据集 - 有没有办法只将第一个数据集插入变量但仍然显示第二个?

java字符串数组作为参数传递oracle存储过程

锁定 SQL Server 存储过程

传递默认参数值与根本不传递参数?

如何给SQLSERVER存储过程传递数组参数