mysql 进:在存储过程中用select 如何给变量赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 进:在存储过程中用select 如何给变量赋值相关的知识,希望对你有一定的参考价值。

BEGIN
declare pamt_out double(10,2);
declare pamt_begin double(10,2);
declare pamt_end double(10,2);
SELECT pamt_out= SUM(amt)
FROM shinaffair.flwq6d
WHERE docid=pdocid;

SELECT pamt_begin= amt_begin
FROM shinhrm.bonuscw
WHERE dept_no=substring(pdocid,3,4 );

set pamt_end=pamt_begin - pamt_out;

UPDATE shinhrm.bonuscw SET amt_out = pamt_out , amt_end =pamt_end where dept_no = substring(pdocid,3,4 );
END

执行结果 好像并没有把值赋给变量pamt_out,pamt_begin 请问这是怎么回事。
在存储过程中用select 给变量赋值具体是怎么使用的。
请教各位高手。在此谢过了。

用select...into语句

下面是mysql 5.0的帮助文档的:
这个SELECT语法把选定的列直接存储到变量。因此,只有单一的行可以被取回。

SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
注意,用户变量名在MySQL 5.1中是对大小写不敏感的。请参阅9.3节,“用户变量”。

重要: SQL变量名不能和列名一样。如果SELECT ... INTO这样的SQL语句包含一个对列的参考,并包含一个与列相同名字的局部变量,MySQL当前把参考解释为一个变量的名字。例如,在下面的语句中,xname 被解释为到xname variable 的参考而不是到xname column的:

CREATE PROCEDURE sp1 (x VARCHAR(5))
BEGIN
DECLARE xname VARCHAR(5) DEFAULT 'bob';
DECLARE newname VARCHAR(5);
DECLARE xid INT;

SELECT xname,id INTO newname,xid
FROM table1 WHERE xname = xname;
SELECT newname;
END;
当这个程序被调用的时候,无论table.xname列的值是什么,变量newname将返回值‘bob’。
参考技术A

用select...into语句。

这个SELECT语法把选定的列直接存储到变量。因此,只有单一的行可以被取回。

重要: 

SQL变量名不能和列名一样。如果SELECT ... INTO这样的SQL语句包含一个对列的参考,并包含一个与列相同名字的局部变量,MySQL当前把参考解释为一个变量的名字。例如,在下面的语句中,xname 被解释为到xname variable 的参考而不是到xname column的:

CREATE PROCEDURE sp1 (x VARCHAR(5))
  BEGIN
    DECLARE xname VARCHAR(5) DEFAULT 'bob';
    DECLARE newname VARCHAR(5);
    DECLARE xid INT;

    SELECT xname,id INTO newname,xid 
      FROM table1 WHERE xname = xname;
    SELECT newname;
  END;

当这个程序被调用的时候,无论table.xname列的值是什么,变量newname将返回值‘bob’。

如何在 Redshift 中的 select 语句中使用存储过程

【中文标题】如何在 Redshift 中的 select 语句中使用存储过程【英文标题】:How to use a stored procedure inside of a select statement in Redshift 【发布时间】:2021-06-16 16:58:04 【问题描述】:

我为 mysql 和其他数据库提供程序找到了一些其他解决方法,但我无法找到在 redshift 中的 select 语句中使用存储过程 (get_data) 的解决方案。我有一个存储过程传递一些 id 并从另一个表创建一个临时表 (tmp_tbl)。然后我想使用该表并通过一些操作从临时表中返回一些数据。

SELECT
    tl.code,
    tl.name,
    SUM(tl.imps) as sales,
    SUM(tl.clicks) as clicks
FROM (

    CALL get_data('id1,id2');

    SELECT * FROM tmp_tbl tl

)
WHERE filter='1990'
GROUP BY 1,2;

作为一种解决方案,我可以在其他地方单独执行存储过程,然后合并结果,但这意味着我必须从我的数据库发出两个单独的请求,我想避免它。或者我想出了其他解决方案,我仍然在不使用 select 语句中的存储过程的情况下进行一个数据库调用,但是我有一些其他代码依赖于这种结构,所以我想实现一个内部语句。有没有办法做到这一点?

程序;

CREATE OR REPLACE PROCEDURE get_data(f1 varchar(max))
AS $$
BEGIN
  DROP TABLE IF EXISTS id_list;

  CREATE TEMPORARY TABLE id_list (
            Id varchar(40)
    );

  DROP TABLE IF EXISTS tmp_tbl;
  FOR loop_var IN 1..(REGEXP_COUNT(f1,',') + 1) LOOP
            INSERT INTO id_list VALUES (SPLIT_PART(f1,',',loop_var));
  END LOOP;
  CREATE TEMP TABLE tmp_tbl as 

    SELECT code, name,sales,clicks
    FROM mview_a
    WHERE id IN (SELECT id FROM id_list)

UNION ALL

    SELECT code, name,sales,clicks
    FROM mview_b
    WHERE id IN (SELECT id FROM id_list)


UNION ALL

    SELECT code, name,sales,clicks
    FROM mview_c
    WHERE id IN (SELECT id FROM id_list)

UNION ALL

    SELECT code, name,sales,clicks
    FROM view_d (combination of multiple mviews)
    WHERE id IN (SELECT id FROM id_list)

UNION ALL

    SELECT code, name,sales,clicks
    FROM mview_e
    WHERE id IN (SELECT id FROM id_list)

【问题讨论】:

get_data 的代码是什么样的? 我会编辑我的帖子并把它放在这里! 【参考方案1】:

难道你不能先运行CALL 来制作临时表,然后在后续的连接中使用它吗?

CALL get_data('id1,id2');

SELECT
    tl.code,
    tl.name,
    SUM(tl.imps) as sales,
    SUM(tl.clicks) as clicks
FROM tmp_tbl tl
WHERE filter='1990'
GROUP BY 1,2;

【讨论】:

嗯,我也想过,但我必须使用联合并使用外部选择语句聚合所有数据,如果我可以应用到我当前的结构,我会考虑这个。我还编辑了原始问题并添加了存储过程 嘿,伙计,我可以根据我的结构调整它并且它有效 - 非常感谢!赞成 @curiosityrock 很高兴听到这个消息。请更新您的帖子以显示您如何对其进行调整以使其正常工作,以便其他人在遇到此帖子时可以找到答案。

以上是关于mysql 进:在存储过程中用select 如何给变量赋值的主要内容,如果未能解决你的问题,请参考以下文章

存储过程给变量赋值

Mysql:存储过程游标不进循环的原因详解

mssql 存储过程中循环如何写,在循环中用啥语句跳出循环呢,在线等

mysql存储过程

MySQL存储过程中使用SELECT …INTO语句为变量赋值

MySQL如何在select中用索引