开发者社区 问答 正文

NVL2函数报invalid input syntax for integer错误



错误描述

  1. [backcolor=transparent]ERROR[backcolor=transparent]:[backcolor=transparent]  invalid input syntax [backcolor=transparent]for[backcolor=transparent] integer[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"aa"
  2. [backcolor=transparent]LINE [backcolor=transparent]1[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]select[backcolor=transparent] nvl2[backcolor=transparent]([backcolor=transparent]'aa'[backcolor=transparent],[backcolor=transparent]1[backcolor=transparent],[backcolor=transparent]2[backcolor=transparent]);
  3. [backcolor=transparent]                    [backcolor=transparent]^
  4. [backcolor=transparent]**********[backcolor=transparent] [backcolor=transparent]Error[backcolor=transparent] [backcolor=transparent]**********
  5. [backcolor=transparent]ERROR[backcolor=transparent]:[backcolor=transparent] invalid input syntax [backcolor=transparent]for[backcolor=transparent] integer[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"aa"
  6. [backcolor=transparent]SQL state[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]22P02
  7. [backcolor=transparent]Character[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]13


解决方案


通过自行扩充一个自定义的public.nvl2即可解决数据类型问题,同时用户无需要调整原有Oracle已经开发好的程序或存储过程。
  1. [backcolor=transparent]create [backcolor=transparent]or[backcolor=transparent] replace [backcolor=transparent]function[backcolor=transparent] [backcolor=transparent]public[backcolor=transparent].[backcolor=transparent]nvl2[backcolor=transparent]([backcolor=transparent]p_v1 [backcolor=transparent]string[backcolor=transparent],[backcolor=transparent] p_v2 anyelement[backcolor=transparent],[backcolor=transparent] p_v3 anyelement[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] anyelement [backcolor=transparent]as
  2. [backcolor=transparent]declare
  3. [backcolor=transparent]    v_v1 [backcolor=transparent]int[backcolor=transparent];
  4. [backcolor=transparent]begin
  5. [backcolor=transparent]    IF p_v1 NOTNULL THEN
  6. [backcolor=transparent]        v_v1[backcolor=transparent]=[backcolor=transparent]1[backcolor=transparent];
  7. [backcolor=transparent]    ELSE
  8. [backcolor=transparent]        v_v1[backcolor=transparent]=[backcolor=transparent]null[backcolor=transparent];[backcolor=transparent]
  9. [backcolor=transparent]    [backcolor=transparent]END[backcolor=transparent] IF[backcolor=transparent];
  10. [backcolor=transparent]    [backcolor=transparent]return[backcolor=transparent] pg_catalog[backcolor=transparent].[backcolor=transparent]nvl2[backcolor=transparent]([backcolor=transparent]v_v1[backcolor=transparent],[backcolor=transparent] p_v2[backcolor=transparent],[backcolor=transparent] p_v3[backcolor=transparent]);
  11. [backcolor=transparent]end[backcolor=transparent];
  12. [backcolor=transparent]select[backcolor=transparent] nvl2[backcolor=transparent]([backcolor=transparent]'aa'[backcolor=transparent],[backcolor=transparent]1[backcolor=transparent],[backcolor=transparent]2[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]--此时运行的应该是上面新建立的[backcolor=transparent]public[backcolor=transparent].[backcolor=transparent]nvl2
  13. [backcolor=transparent]select[backcolor=transparent] nvl2[backcolor=transparent]([backcolor=transparent]100[backcolor=transparent],[backcolor=transparent]1[backcolor=transparent],[backcolor=transparent]2[backcolor=transparent]);[backcolor=transparent]  [backcolor=transparent]--此时运行的应该是系统原生的[backcolor=transparent]pg_catalog[backcolor=transparent].[backcolor=transparent]nvl2
  14. [backcolor=transparent]select[backcolor=transparent] nvl2[backcolor=transparent]([backcolor=transparent]null[backcolor=transparent],[backcolor=transparent]1[backcolor=transparent],[backcolor=transparent]2[backcolor=transparent]);[backcolor=transparent]  [backcolor=transparent]--此时运行的应该是系统原生的[backcolor=transparent]pg_catalog[backcolor=transparent].[backcolor=transparent]nvl2

展开
收起
云栖大讲堂 2017-10-18 13:55:24 2989 分享 版权
阿里云 AI 助理回答

这个错误信息表明您在执行SQL查询时遇到了数据类型不匹配的问题。具体来说,错误提示invalid input syntax for integer: "aa"指出尝试将字符串"aa"作为整数使用,这是不允许的。问题出在您调用的nvl2函数的第一个参数传递了一个非数字字符(即"aa"),而该函数在这个位置期望的是一个可以转换为整数的值。

解决方案中提到的自定义函数public.nvl2是一个扩展方法,旨在解决原始nvl2函数在处理不同数据类型时的局限性。通过创建这个自定义函数,您可以使函数能够接受字符串类型的输入,并根据输入是否为NULL来决定返回哪个值,同时避免了直接将字符串与数值进行比较时的数据类型冲突。

下面是解决方案中的自定义函数代码简化版和解释:

CREATE OR REPLACE FUNCTION public.nvl2(
    p_v1 text,          -- 修改为text以接受任何文本
    p_v2 anyelement,
    p_v3 anyelement
) RETURNS anyelement AS $$
DECLARE
    v_v1 int;
BEGIN
    IF p_v1 IS NOT NULL THEN 
        v_v1 := 1;       -- 如果p_v1非空,则赋值为1
    ELSE 
        v_v1 := NULL;    -- 否则v_v1保持为NULL
    END IF;
    RETURN pg_catalog.nvl2(v_v1, p_v2, p_v3); -- 使用内部的nvl2函数处理经过转换的v_v1
END;
$$ LANGUAGE plpgsql;

这段代码定义了一个新的nvl2函数,它首先检查第一个参数p_v1是否为NULL。如果p_v1不是NULL,它就将一个默认值(这里是1)用于内部逻辑,这样就能确保后续的pg_catalog.nvl2调用不会因为直接接收原始的非整型数据而失败。这样做允许您的查询更加健壮,能够适应不同类型的输入,而不需要修改所有已有的调用此函数的地方。

请注意,在实际应用中,根据您的数据库环境(如PostgreSQL或Oracle)和具体需求,可能需要调整函数定义中的数据类型和逻辑细节。此外,确保在执行此类操作前备份数据库或在测试环境中验证更改,以防止生产环境出现意外情况。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: