я получаю ORA-01722: ошибка недопустимого номера в plsql

#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. я уже пытаюсь, но на этот раз я жду выполнения… и ответа нет.