Mysql 如何使用会话变量缩短存储过程中的参数需求?

Mysql 如何使用会话变量缩短存储过程中的参数需求?,mysql,stored-procedures,session-variables,mariadb,Mysql,Stored Procedures,Session Variables,Mariadb,通过使用程序员通常在应用程序中执行的命令创建存储过程,我尝试在数据库中运行尽可能多的逻辑业务。所以在我的Java/PHP/etc代码中不再有“select*fromtable” 我创建了如下程序: create procedure show_clients(user_account integer, client_type varchar) begin select client_name from clients where type = clien

通过使用程序员通常在应用程序中执行的命令创建存储过程,我尝试在数据库中运行尽可能多的逻辑业务。所以在我的Java/PHP/etc代码中不再有“select*fromtable”

我创建了如下程序:

create procedure show_clients(user_account integer, client_type varchar)
begin
       select client_name from clients 
              where type = client_type and
                 user_owner = user_account; -- < this is done in every query
end
注意:我指的会话是用户登录的web应用程序会话。我想知道MySQL调用是否会识别这个应用程序的会话,并将来自它的所有调用统一到它的DBMS中的一个会话中


或者。。我是否必须为我的应用程序的每个用户创建一个MySQL用户,以便MySQL为他们存储会话变量?

我发现这是可能的

但我只在Delphi上进行了测试,在手动断开数据库连接组件或终止程序之前,MySQL会话一直保持活动状态

我们可以使用set@varxyz=123;在存储过程中,我也可以使用它的值进行选择。不幸的是,我们不能在视图内部使用这些会话变量,也不能在过程外部设置它们

在PHP中,不可能使用这种方法,因为对服务器的每次调用都会建立一个新的数据库连接,因此,我创建了一个新会话,我们在会话之前释放了那些变量。我还没有测试是否可以将数据库连接var$connect保存在PHP会话数组中。我可以,但它会在下一个会话启动时在DB中保持相同的会话吗

我将测试它,稍后将结果发布到这里


任何人都可以告诉我,当用户向servlet请求页面时,Java方式是否可以保持db会话打开?

您正在尝试解决一个不是问题的问题,并为自己创建新的问题。不要试图将数据库连接与web用户帐户相关联,也不要试图保持一个连接-这是自找麻烦,将自己设计成一个充满限制的角落,如果不放弃此策略,您将无法扩展。将用户标识符传递给每个过程。这里还有一些不准确之处。用户定义的@变量的作用域是数据库连接,可以在过程内外自由使用,并保留其值,直到清除或断开连接。它们不能直接在视图中使用,但如果将它们包装到存储函数中,它们可以在视图中使用。。。但说真的,不要做你想做的事情,因为海森堡和性能/可伸缩性问题等着你。另外,不,您通常不能在web服务器会话中存储数据库连接,即使可以,这也是一个坏主意。谢谢您的意见,但我会在实现它之前做一个全面的研究,我不疯狂。我将使用Delphi作为Web服务器,只要我告诉他们,它将保持会话和db连接。
create procedure login(_username, _password)
begin
    sessionUserId = 0;
    select user_id into sessionUserId from users 
        where login = _username and password = _password;
    if sessionUserId is null
        select sessionUserId;
        exit;
    else
        select * from users where id = sessionUserId;
        session_vars.this_session_id = sessionUserId; -- < more or less like this
end

create procedure new_show_clients(client_type varchar) -- < more light
begin
       select client_name from clients 
              where type = client_type and
                 user_owner = session_vars.this_session_id; -- < no need for a parameter!
end