Aracılığıyla paylaş


ARITHMETIC_OVERFLOW hata sınıfı

SQLSTATE: 22003

<message>.<alternative> Gerekirse bu hatayı atlamak için "false" olarak ayarlayın <config> .

Parametre

  • message: Taşmalara neden olan ifadenin açıklaması.
  • alternatif: Hatadan nasıl kaçınılması konusunda öneride bulunarak.
  • yapılandırma: ANSI modunu değiştirmek için yapılandırma ayarı.

Açıklama

Azure Databricks, işlemin gerçekleştirildiği veri türü üst sınırını aşan bir matematik işlemi gerçekleştirdiğinde aritmetik bir taşma oluşur.

Çoğu durumda matematik, bir işlecin işlenenlerinin en az ortak türünde veya bir işlevin bağımsız değişkenlerinin en az ortak türünde gerçekleştirilir.

türünde iki sayı TINYINT eklemek, ile sınırlı -128+127olan tür aralığını hızla aşabilir. ve gibi TIMESTAMPINTERVAL diğer türler de büyük, ancak sınırlı bir aralığa sahiptir.

Bir tür etki alanının tanımı için veri türünün tanımına bakın.

Azaltma

Bu hatanın hafifletilmesi nedene bağlıdır:

  • Matematik veya giriş bağımsız değişkenlerinden herhangi biri yanlış mı?

    Kullanılan işlevleri veya giriş verilerini uygun şekilde düzeltin.

    Ara sonuçları istenen aralıkta tutmak için işlemleri yeniden sıralamayı da düşünebilirsiniz.

  • Veri türü en geniş tür değil mi?

    Bağımsız değişkenlerden birini işlemi tamamlamak için yeterli bir türe dönüştürerek türü genişletin.

    Uygun bir değer seçmek DOUBLE veya DECIMAL(38, s) uygun s bir değerle yuvarlama maliyetinde çok fazla aralık sağlar.

  • Taşma koşullarını tolere edebilir ve bunları ile NULLdeğiştirebilir misiniz?

    ifadesini içinde alternativeönerilen işlevi kullanacak şekilde değiştirin. Örneğin toplam yerine try_sum kullanın.

  • İfadeyi değiştiremezsiniz ve hata döndürmek yerine sarmalanmış sonuçlar mı elde edersiniz?

    Son çare olarak, olarak ayarlayarak ansiConfigfalseANSI modunu devre dışı bırakın.

Örnekler

-- An overflow of a small numeric
> SELECT 100Y * 100Y;
 [ARITHMETIC_OVERFLOW] 100S * 100S caused overflow.
 If necessary set ansi_mode to "false" (except for ANSI interval type) to bypass this error.

-- Use a wider numeric to perform the operation by casting one of the operands
> SELECT 100Y * cast(100Y AS INTEGER);
 10000

-- An overflow of a complex expression which can be rewritten
> SELECT 100Y * 10Y / 5;
 [ARITHMETIC_OVERFLOW] 100S * 10S caused overflow.
 If necessary set spark.sql.ansi.enabled to "false" (except for ANSI interval type) to bypass this error.

-- Rewrite the expression
> SELECT 100Y / 5 * 10Y;
 200.0

-- An occasional overfklow that should be tolerated
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
 [ARITHMETIC_OVERFLOW] 100S * 100S caused overflow.
 If necessary set ansi_mode to "false" (except for ANSI interval type) to bypass this error.

-- Allowing overflows to be treated as NULL
> SELECT try_multiply(arg1, arg2) FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
  NULL
  100

-- In Databricks SQL temporarily disable ANSI mode to tolerate incorrect overflow.
> SET ANSI_MODE = false;
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
  16
  100
> SET ANSI_MODE = true;

-- In Databricks Runtime temporarily disable ANSI mode to tolerate incorrect overflow.
> SET spark.sql.ansi.enabled = false;
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
  16
  100
> SET spark.sql.ansi.enabled = true;