Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да направя рекурсивен pl/sql кодов блок, който да работи с няколко избрани изречения?

Не си описал своя rec тип, така че ще покажа пример как да го направя по-независим:

declare
    type t_rec is record(
        param1 varchar2(30),
        param2 varchar2(30),
        param3 varchar2(30),
        param4 varchar2(30),
        param5 varchar2(30)
        );
    rec t_rec;
    v_tx_cuerpo varchar2(4000);
    
    function f_subst(str varchar2, template varchar2, subst ora_name_list_t) return varchar2
    as
        res varchar2(32767):=str;
    begin
        for i in 1..subst.count loop
            res:=replace(res, replace(template,'%d',i), subst(i));
        end loop;
        return res;
    end;
begin
    v_tx_cuerpo:='p1:${param1};p2:${param2};p3:${param3};p4:${param4};p5:${param5};';
    v_tx_cuerpo:=f_subst(
                    v_tx_cuerpo,
                    '${param%d}',
                    ora_name_list_t('str1','str2','str3','str4','str5')
                    );
    dbms_output.put_line(v_tx_cuerpo);
end;
/

както виждате, създадох function f_subst който приема 3 аргумента:

  • str varchar2 - входен низ за заместване
  • template varchar2 - маска на низ за заместване, във вашия пример това е ${param%d}
  • subst ora_name_list_t - това е колекция дефиниран като TYPE ora_name_list_t IS TABLE OF VARCHAR2(2*(ORA_MAX_NAME_LEN+2)+1) , така че можете да посочите произволен брой низове за замяна. В този пример съм поставил str1 към str5 .

Така че тази функция итерира елементите на входната колекция и заменя всички поднизове, които съответстват на маска на входен шаблон със стойността от тази колекция.

Резултати:

p1:str1;p2:str2;p3:str3;p4:str4;p5:str5;

И накрая с помощта на вашия оригинален rec :

declare
    type t_rec is record(
        param1 varchar2(30),
        param2 varchar2(30),
        param3 varchar2(30),
        param4 varchar2(30),
        param5 varchar2(30)
        );
    rec t_rec;
    v_tx_cuerpo varchar2(4000);
    
    function f_subst(str varchar2, template varchar2, subst ora_name_list_t) return varchar2
    as
        res varchar2(32767):=str;
    begin
        for i in 1..subst.count loop
            res:=replace(res, replace(template,'%d',i), subst(i));
        end loop;
        return res;
    end;
begin
    v_tx_cuerpo:='p1:${param1};p2:${param2};p3:${param3};p4:${param4};p5:${param5};';
    rec.param1:='str1';
    rec.param2:='str2';
    rec.param3:='str3';
    rec.param4:='str4';
    rec.param5:='str5';
    
    v_tx_cuerpo:=f_subst(
                    v_tx_cuerpo,
                    '${param%d}',
                    ora_name_list_t(
                        rec.param1,
                        rec.param2,
                        rec.param3,
                        rec.param4,
                        rec.param5
                        )
                    );
    dbms_output.put_line(v_tx_cuerpo);
end;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle JDBC PreparedStatement Игнориране на крайни интервали

  2. Извличане на стойност на xml елемент в Oracle PL SQL

  3. Как да намеря дублиращи се стойности в таблица в Oracle?

  4. Каква е максималната дължина на израза в Oracle

  5. Проверка дали даден елемент не съществува в друга таблица