2013-07-23 198 views
1

这里的程序:Oracle过程错误:数字或值错误:数字精度太大?

CREATE OR REPLACE PROCEDURE GetBestSellingMovieByTimeId(timeId IN NUMBER) IS 
    movieName Movie.Name%type; 
    saleValue Sales.SaleValue%type; 
BEGIN 
SELECT * INTO movieName, salevalue FROM (
    SELECT m.Name, SUM(s.SaleValue) AS TotalSales 
    FROM Sales s 
    INNER JOIN Movie m ON s.MovieId = m.MovieId 
    WHERE s.TimeId = timeId 
    GROUP BY m.Name ORDER BY TotalSales DESC 
) WHERE ROWNUM = 1; 
    dbms_output.put_line(movieName ||', ' || saleValue); 
END; 
/
exec GetBestSellingMovieByTimeId(2); 

这里的错误:

Error starting at line 190 in command: exec GetBestSellingMovieByTimeId(2) 
Error report: 
ORA-06502: PL/SQL:numeric or value error: number precision too large 
ORA-06512: at "CM420B17.GETBESTSELLINGMOVIEBYTIMEID", line 5 
ORA-06512: at line 1 
06502. 00000 - "PL/SQL: numeric or value error%s" 
*Cause:  
*Action: 

TIMEID是一个数字(2,0)FK在销售表。将数字2传递给过程不应超出NUMBER(2,0)数据类型的范围。

为什么这个程序认为IN参数太大?

+2

您是否尝试使用Developer或SQL * Plus上的参数在函数内部运行查询?在我看来,你的saleValue变量对于结果来说太短了。 – tilley31

+0

错误在第5行 - > SELECT * INTO movieName,salevalue FROM ...什么是saleValue Sales.SaleValue%类型的类型?该过程试图为此变量分配SUM(xxx)的结果,该结果的类型为NUMERIC。 – krokodilko

+0

这正是问题所在。 SaleValue的NUMBER字段太小,无法保存销售额的总和。谢谢@ tilly31和kordirko,问题已解决。 – Chaddeus

回答

3

您的查询选择SUM(s.SaleValue)到变量saleValue定义为Sales.SaleValue%type

通常使用%type语法是很好的做法,但只有当它匹配指定的值时。如果Sales.SaleValue使用scale和precision定义,那么该列的SUM()很可能会冲击该定义的边界。这似乎就是这种情况。

相关问题