当前位置: 首页 > 知识库问答 >
问题:

关于mysql中存储函数的询问

甘兴学
2023-03-14

分隔符$$

--

CREATE definer=root@localhostFUNCTIONrty_check_member_info_status(memb_id int,field_name_1 varchar(100),field_name_2 varchar(100),login_member_amount int(11),login_status char(1))返回char(1)CHARSET latin1 begin declare fn_field_name_1 varchar(100);声明fn_field_name_2 varchar(100);声明fn_amount_for_profile_visible int(11);

declare fn_return char(1) default 'N';

declare test_field varchar(100);    

select field_name_1,field_name_2,amount_for_profile_visible into
fn_field_name_1,fn_field_name_2,fn_amount_for_profile_visible
from member_account_settings inner join tbl_members on member_account_settings.member_auto_id = tbl_members.member_id 
where tbl_members.member_id = memb_id  ;

if fn_field_name_1 = 'H' Then
   set fn_return = 'N' ;
else
if fn_field_name_2 = 'Y' Then
    if fn_amount_for_profile_visible = '0' Then
    set fn_return = 'Y' ;
    else
       if login_status = 1 Then
              if fn_amount_for_profile_visible > login_member_amount Then
              set fn_return = 'N' ;
              else
              set fn_return = 'Y' ; 
              end if;
       else 
       set fn_return = 'N';  
       end if ;  
    end if;    
else
set fn_return = 'Y';
end if ;
end if ;

return fn_return ;

End$$分隔符;

共有1个答案

宋凌龙
2023-03-14

您有两种选择:几乎生成的SQL(通常不是一个好主意,因为它更难编写、调试和文档)和使用case语句根据匹配字符串的名称选择列(通常是一个很好的解决方案)。

这里有第二个例子,因为这是我绝对推荐的解决方案。

SET @test_field1 = "last_name_display_status" ;
SET @test_field2 = "last_name_display_for_other_partcpnt" ;

SELECT
     CASE @test_field1
        -- List columns here that you might want to return:
        WHEN 'last_name_display_status' THEN last_name_display_status
        WHEN 'last_name_display_for_other_partcpnt' THEN last_name_display_for_other_partcpnt
        WHEN 'create_date' THEN create_date
        -- Return a value for an invalid name here:
        ELSE NULL
     END AS test_field1,
     CASE @test_field2
        -- List columns here that you might want to return:
        WHEN 'last_name_display_status' THEN last_name_display_status
        WHEN 'last_name_display_for_other_partcpnt' THEN last_name_display_for_other_partcpnt
        WHEN 'create_date' THEN create_date
        -- Return a value for an invalid name here:
        ELSE NULL
     END AS test_field2,
     -- Rest of select unaffected by this change
     amount_for_profile_visible
   INTO
     fn_field_name_1,
     fn_field_name_2,
     fn_amount_for_profile_visible
FROM member_account_settings
INNER JOIN tbl_members
  ON member_account_settings.member_auto_id = tbl_members.member_id
WHERE
  tbl_members.member_id = memb_id
;

为了完整起见,我提供了第一个解决方案的副本(生成的SQL):

-- Need to use @vars, since named vars aren't in scope for the generated SQL:
SET @output1 = '';
SET @output2 = '';
SET @output3 = '';
SET @input1 = memb_id;

-- We also need to store our generated SQL to a variable
SET @query = 'SELECT ' + @test_field1 + ',' + @test_field2 + ', amount_for_profile_visible INTO @output1, @output2, @output3 FROM member_account_settings INNER JOIN tbl_members ON member_account_settings.member_auto_id = tbl_members.member_id WHERE tbl_members.member_id = ?';
-- To execute the code we have to convert it to a prepared statement
-- named stmt here, because it's what most people use in this instance
PREPARE stmt FROM @query;
-- Execute the statement using our input variable
EXECUTE stmt USING @input1;
-- Delete the prepared statement now we've run it.
DEALLOCATE PREPARE stmt;

-- Store our @vars back into the named vars.
SET fn_field_name_1 = @output1;
SET fn_field_name_2 = @output2;
SET fn_amount_for_profile_visible = @output3;
 类似资料:
  • 存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合。存储函数可以通过 return 语句返回函数值,主要用于计算并返回一个值。而存储过程没有直接返回值,主要用于执行操作。 在 MySQL 中,使用 CREATE FUNCTION 语句来创建存储函数,其语法形式如下: CREATE FUNCTION sp_name ([func_parameter[...]]) RETURNS ty

  • 问题内容: 我正在尝试制作一个可为特定类别递归构建路径的函数 当我尝试使用没有父项的类别(parent_id = 0)运行此函数时,它可以正常工作,但是当我尝试使用parent_id> 0的类别时,我得到1424递归存储的函数和触发器是不允许的。 我该如何解决?我将在常规的Web托管服务上托管此代码,该服务至少应具有MySQL服务器版本5.1。 在Ike Walker的帮助下,我做了一个程序,但是

  • 问题内容: 我在存储过程中创建一个动态查询。我的存储过程如下: 当我尝试通过以下调用运行它时: 我收到以下错误消息: 错误代码:1054。“ where子句”中的未知列“ SPA” 我在没有where条件的情况下进行了测试,并且工作正常,但是在where条件不起作用的情况下,我尝试使用@和变量名一起使用,但仍然无法正常工作。 谢谢你的帮助。 问题答案: 您错过了条款中的引号。 尝试这样: 说明 :

  • 本文向大家介绍MySql存储过程与函数详解,包括了MySql存储过程与函数详解的使用技巧和注意事项,需要的朋友参考一下 存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复的编写相同的SQL语句。而且,存储过程和函数是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输。 一、存储过程 1

  • 主要内容:调用存储过程,调用存储函数存储过程和存储函数都是存储在服务器端的 SQL 语句集合。要想使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现。 存储过程通过 CALL 语句来调用,存储函数的使用方法与 MySQL 内部函数的使用方法相同。执行存储过程和存储函数需要拥有 EXECUTE 权限(EXECUTE 权限的信息存储在 information_schema 数据库下的 USER_PRIVILEGES 表中

  • 本文向大家介绍理解MySQL存储过程和函数,包括了理解MySQL存储过程和函数的使用技巧和注意事项,需要的朋友参考一下 一、概述  一提到存储过程可能就会引出另一个话题就是存储过程的优缺点,这里也不做讨论,一般别人问我我就这样回答你觉得它好你就用它。因为mysql中存储过程和函数的语法非常接近所以就放在一起,主要区别就是函数必须有返回值(return),并且函数的参数只有IN类型而存储过程有IN、