#sql #oracle #plsql
#sql #Oracle #plsql
Вопрос:
у меня проблема с ora 01722, у меня есть строковые профили, они похожи на «1501,1701,1901,2001,2501,2601» или «2321,1331,111231,35501», и я хочу, чтобы таблица управления x’ column x.rol_id включала профили или нет, но я получаю ошибку в своем коде. вот часть моего кода. Спасибо.
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;
Комментарии:
1. Почему бы вам не вставить эти значения, разделенные запятыми, в таблицу?
select prols rol from dual t
не имеет смысла. Нужно ли заменятьprols
такими разделенными запятыми строками каждый раз, когда вам нужно запускать ..?
Ответ №1:
Если вы говорите, что разделяемые вами строки имеют разделитель, ,
тогда вам нужно изменить регулярное выражение [^,]
на включить ,
вместо ;
или наоборот
Я только что попробовал, и это работает,
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;
Тест:
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.
Комментарии:
1. сэр, мои профили изменчивы, это может быть что-то вроде «1501,12331,22201,25501,23301».
2. Вы имеете в виду, что это может быть с разделителем
,
или;
?3. нет, я имею в виду, что моя строка может быть изменена. например, «1501,1701,1901,2001,2501,2601» или «2321,1331,111231,35501» или «9801,1101,67001,254»
4. Да, это нормально. Ваш запрос в порядке, и вам нужно изменить шаблон, как я сделал в своем ответе.
5. я уже пытаюсь, но на этот раз я жду выполнения… и ответа нет.