我得到ORA-01722:plsql中的无效数字错误
我有关于ora 01722的问题,我有字符串prols,它类似于“150117011901200125012601”或“232113311123135501”,我希望控制表x'列x.rol_id是否包含prols,但我的代码中有错误。这是我的部分代码。谢谢我得到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
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.