delphi 使用子查询时出现INTERBASE错误参数编号错误

ix0qys7i  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(95)

我一直致力于从SQLITE切换到Interbase数据库。我遇到的一个问题是“bad parameter number”错误。因此,我回到Embarcadero提供的一个示例数据库(EMPLOYEE),尝试各种SQL命令来重现问题。
这是一个场景:我想要一个查询,它给出了对特定客户的所有销售额超过预先指定金额的平均销售额。所以,这里有一个查询,适用于:

SELECT AVG(TOTAL_VALUE) AS AvgSales
FROM SALES
WHERE TOTAL_VALUE > :TOTAL_VALUE
  AND CUST_NO = :CUSTNO

现在,我想把这个平均值存储在一个表中。但你怎么能这么做呢?以下是我尝试的:

UPDATE <table>
SET <Column> = (SELECT AVG(TOTAL_VALUE) AS AvgSales
                FROM SALES
                WHERE TOTAL_VALUE > :TOTAL_VALUE
                  AND CUST_NO = :CUST_NO)

但是当你尝试执行它时,它会给出错误消息“bad parameter number”
如果你硬编码这两个参数,它工作得很好:

UPDATE <table>
SET <Column> = (SELECT AVG(TOTAL_VALUE) AS AvgSales
                FROM SALES
                WHERE TOTAL_VALUE > 10000
                  AND CUST_NO = 1001)

经过更多的实验,在我看来,子查询中的任何参数都将生成相同的错误消息,而不是执行。例如,这也会生成相同的错误消息(并对参数进行硬编码):

SELECT AMT
FROM
    (SELECT AVG(TOTAL_VALUE) AS AvgSales
     FROM  SALES
     WHERE TOTAL_VALUE > :TOTAL_VALUE
       AND CUST_NO = :CUSTNO
    ) X(Amt)

那么,如何在Interbase表中存储这样的值呢?

qacovj5a

qacovj5a1#

使用一个程序可以解决你的问题,该方案:

CREATE OR ALTER PROCEDURE UPDATEAVERAGES(CUSTNO INTEGER,TOT NUMERIC())
AS 
DECLARE VARIABLE NEWVALUE NUMERIC();
BEGIN 
SELECT AVG(TOTAL_VALUE) FROM SALES WHERE TOTAL_VALUE>:TOT AND CUST_NO=:CUSTNO INTO :NEWVALUE;
UPDATE <table> SET <column>=:NEWVALUE <where>;
END;
9wbgstp7

9wbgstp72#

在SQL服务器中,我们可以通过使用变量来避免这一点:

declare @i int
select @i = :CUST_NO
select * from sales where CUST_NO  = @i

相关问题