1

手順は次のとおりです。

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 は、Sales テーブルの NUMBER(2,0) FK です。数値 2 をプロシージャに渡すことは、NUMBER(2,0) データ型の範囲外であってはなりません。

この手順で IN パラメータが大きすぎると判断されるのはなぜですか?

4

1 に答える 1

3

クエリは、として定義さ SUM(s.SaleValue)れた変数を選択します。saleValueSales.SaleValue%type

通常は%type構文を使用することをお勧めしますが、割り当てられた値と一致する場合に限ります。がスケールと精度で定義されている場合Sales.SaleValue、その列の SUM() がその定義の境界を超える可能性が非常に高くなります。ここに当てはまるようです。

于 2013-07-23T07:09:27.750 に答える