我得到ORA-01722:plsql中的无效数字错误

我得到ORA-01722:plsql中的无效数字错误,sql,oracle,plsql,Sql,Oracle,Plsql,我有关于ora 01722的问题,我有字符串prols,它类似于“150117011901200125012601”或“232113311123135501”,我希望控制表x'列x.rol_id是否包含prols,但我的代码中有错误。这是我的部分代码。谢谢 function get_menu_detay_01(pmenu_kod varchar2, proller varchar2) return sys_r

我有关于ora 01722的问题,我有字符串prols,它类似于“150117011901200125012601”或“232113311123135501”,我希望控制表x'列x.rol_id是否包含prols,但我的代码中有错误。这是我的部分代码。谢谢

 function get_menu_detay_01(pmenu_kod      varchar2,
                             proller          varchar2) return sys_refcursor is
  v_cr_1 sys_refcursor;

      begin
        open v_cr_1 for
         select distinct mtd.sira_no,
                 mtd.seviye_1,
                 mtd.fa_icon_1,
                 mtd.seviye_2,
                 mtd.fa_icon_2,
                 mtd.seviye_3,
                 mtd.fa_icon_3,
                 ut.uygulama_tanim_id,
                 ut.aciklama,
                 ut.path,
                 ut.fa_icon,
                 ut.href,
                 ut.onclick
            from uat.menu_tanim_d mtd
            left join uat.uygulama_tanim ut
              on ut.uygulama_tanim_id = mtd.uygulama_tanim_id
           left join uat.uygulama_yetki uy 
             on mtd.uygulama_tanim_id = uy.uygulama_tanim_id  
           where mtd.menu_kod = pmenu_kod
           and uy.rol_id  in (select regexp_substr(tt.rol, '[^,]+', 1, level)
                            from (select proller rol
                                    from dual t) tt
                          connect by regexp_substr(tt.rol, '[^,]+', 1, level) is not null)
           order by mtd.sira_no;

    return v_cr_1;
  end;  

如果您说要拆分的字符串具有分隔符
,则需要将正则表达式
[^,]+
改为包含
或相反的方式

我只是试过了,而且很有效

WITH tst
AS
(SELECT 1501 rol_id FROM dual
 UNION ALL
 SELECT 1701 FROM dual
 UNION ALL
 SELECT 1901 FROM dual
 UNION ALL
 SELECT 2001 FROM dual
 UNION ALL
 SELECT 2501 FROM dual
 UNION ALL
 SELECT 2601 FROM dual
) 
SELECT * 
  FROM tst x
 WHERE x.rol_id  in (select regexp_substr(tt.rol, '[^,]+', 1, LEVEL)
                            from (select '1701,1901,2001,2501,2601' rol
                                    from dual t) tt
                          connect by regexp_substr(tt.rol, '[^,]+', 1, level) is not null);

编辑:使用函数进行测试请检查如何调用函数并以正确的格式传递字符串

CREATE OR REPLACE FUNCTION get_menu_detay_01(proller VARCHAR2)
RETURN SYS_REFCURSOR
IS
 v_cr_1 SYS_REFCURSOR;
BEGIN
 OPEN v_cr_1 FOR
    SELECT *
    FROM   (  SELECT 1501 rol_id FROM dual
              UNION ALL
              SELECT 1701 FROM dual
              UNION ALL
              SELECT 1901 FROM dual
              UNION ALL
              SELECT 2001 FROM dual
              UNION ALL
              SELECT 2501 FROM dual
              UNION ALL
              SELECT 2601 FROM dual
           ) x
    WHERE  x.rol_id IN (SELECT regexp_substr(tt.rol,'[^,)]+',1,LEVEL)
                        FROM   (SELECT proller rol FROM dual t) tt
                        CONNECT BY regexp_substr(tt.rol,'[^,]+',1,LEVEL) IS NOT NULL);

  RETURN v_cr_1;
END get_menu_detay_01;
测试:


先生,我的prols是可变的,它可能像“150112331222012550123301”。您的意思是它可能带有分隔符
?不,我是说我的字符串可以更改。比如“150117011901200125012601”或“232113311123135501”或“9801110167001254”是的,这很好。您的查询很好,您需要像我在回答中所做的那样更改模式。我已经尝试过了,但这次我正在等待执行。。。没有响应。为什么不在表中插入逗号分隔的值呢<代码>从双t选择prols rol
没有意义。在需要运行时,是否必须用逗号分隔的字符串替换
prols
。。?
set serveroutput on;
DECLARE
 lo_ref_cur SYS_REFCURSOR;
 lo_number NUMBER;
BEGIN
  lo_ref_cur :=  get_menu_detay_01('1701,1901,2001,2501,2601');
  LOOP 
    FETCH lo_ref_cur INTO lo_number;
    EXIT WHEN lo_ref_cur%NOTFOUND;
    dbms_output.put_line(lo_number); 
  END LOOP;
END;
/
Output:
------
1701
1901
2001
2501
2601

PL/SQL procedure successfully completed.