Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zrobić rekurencyjny blok kodu pl/sql, który działa z kilkoma wybranymi zdaniami?

Nie opisałeś swojego rec typ, więc pokażę przykład, jak uczynić go bardziej niezależnym:

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;
/

jak widać stworzyłem function f_subst wymaga 3 argumentów:

  • str varchar2 - ciąg wejściowy do wymiany
  • template varchar2 - maska ​​ciągu do wymiany, w twoim przykładzie to ${param%d}
  • subst ora_name_list_t - to jest kolekcja zdefiniowany jako TYPE ora_name_list_t IS TABLE OF VARCHAR2(2*(ORA_MAX_NAME_LEN+2)+1) , dzięki czemu można określić dowolną liczbę ciągów do zamiany. W tym przykładzie umieściłem str1 do str5 .

Tak więc ta funkcja iteruje elementy kolekcji danych wejściowych i zastępuje wszelkie podciągi, które pasują do maski szablonu danych wejściowych, wartością z tej kolekcji.

Wyniki:

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

I wreszcie przy użyciu oryginalnego 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. Optymalizacja kodu w PL/SQL. Dokonywanie tego do właściwego. Kod działa, ale nie jest prawidłowy

  2. Łączenie 2 if block i tworzenie pojedynczego zapytania

  3. Jak używać zmiennych w klauzuli gdzie Oracle PL/SQL

  4. Sprawdź, czy tabele są identyczne, używając SQL w Oracle

  5. Wyzwalacz, który wstawia wiersz do tabeli dziennika podczas wstawiania lub usuwania w tabeli osób skompilowanej z błędami