gpt4 book ai didi

mysql - 如何在存储过程中使用准备好的语句分配变量?

转载 作者:可可西里 更新时间:2023-11-01 07:05:30 27 4
gpt4 key购买 nike

我整理了一个简单的存储过程,其中传递了两个参数以使其更具动态性。我在“前两位数字和记录数”部分中使用准备好的语句完成了此操作。

我不确定的是我是否也可以使用准备好的语句使 SET vTotalFT 部分动态化。

目前我必须对表名和字段进行硬编码。我希望根据准备好的动态 SQL 语句分配我的 vTotalFT 变量,但我不确定语法。这个想法是,当我调用我的过程时,我可以告诉它要使用哪个表和哪个字段进行分析。

CREATE PROCEDURE `sp_benfords_ft_digits_analysis`(vTable varchar(255), vField varchar(255))
SQL SECURITY INVOKER
BEGIN

-- Variables
DECLARE vTotalFT int(11);

-- Removes existing table
DROP TABLE IF EXISTS analysis_benfords_ft_digits;

-- Builds base analysis table
CREATE TABLE analysis_benfords_ft_digits
(
ID int(11) NOT NULL AUTO_INCREMENT,
FT_Digits int(11),
Count_of_Records int(11),
Actual decimal(18,3),
Benfords decimal(18,3),
Difference Decimal(18,3),
AbsDiff decimal(18,3),
Zstat decimal(18,3),
PRIMARY KEY (ID),
KEY id_id (ID)
);

-- First Two Digits and Count of Records
SET @s = concat('INSERT INTO analysis_benfords_ft_digits
(FT_Digits,Count_of_Records)
select substring(cast(',vField,' as char(50)),1,2) as FT_Digits, count(*) as Count_of_Records
from ',vTable,'
where ',vField,' >= 10
group by 1');

prepare stmt from @s;
execute stmt;
deallocate prepare stmt;

SET vTotalFT = (select sum(Count_of_Records) from
(select substring(cast(Gross_Amount as char(50)),1,2) as FT_Digits, count(*) as Count_of_Records
from supplier_invoice_headers
where Gross_Amount >= 10
group by 1) a);


-- Actual
UPDATE analysis_benfords_ft_digits
SET Actual = Count_of_Records / vTotalFT;

-- Benfords
UPDATE analysis_benfords_ft_digits
SET Benfords = Log(1 + (1 / FT_Digits)) / Log(10);

-- Difference
UPDATE analysis_benfords_ft_digits
SET Difference = Actual - Benfords;

-- AbsDiff
UPDATE analysis_benfords_ft_digits
SET AbsDiff = abs(Difference);

-- ZStat
UPDATE analysis_benfords_ft_digits
SET ZStat = cast((ABS(Actual-Benfords)-IF((1/(2*vTotalFT))<ABS(Actual-Benfords),(1/(2*vTotalFT)),0))/(SQRT(Benfords*(1-Benfords)/vTotalFT)) as decimal(18,3));

最佳答案

首先,要使用动态表/列名称,您需要使用字符串/Prepared Statement就像您对 @s 的第一个查询。接下来,要从查询中的 COUNT() 获取返回值,您需要使用 SELECT .. INTO @vTotalFT .

以下应该是您所需要的:

SET @vTotalFTquery = CONCAT('(select sum(Count_of_Records) INTO @vTotalFT from
(select substring(cast(', vField, ' as char(50)),1,2) as FT_Digits, count(*) as Count_of_Records
from ', vTable, '
where ', vField, ' >= 10
group by 1) a);');
PREPARE stmt FROM @vTotalFTquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

请注意:变量名已从 vTotalFT 更改为 @vTotalFT。如果没有 @,它似乎无法工作。此外,变量 @vTotalFT 在查询之外/之前声明时将不起作用,因此如果您遇到错误或空结果,这可能是一个原因。

关于mysql - 如何在存储过程中使用准备好的语句分配变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11691977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com