Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để tạo đệ quy một khối mã pl / sql mà một khối làm việc với một số câu được chọn?

Bạn chưa mô tả rec của mình nhập, vì vậy tôi sẽ đưa ra một ví dụ về cách làm cho nó độc lập hơn:

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

như bạn có thể thấy, tôi đã tạo function f_subst cần 3 đối số:

  • str varchar2 - chuỗi đầu vào để thay thế
  • template varchar2 - mặt nạ chuỗi để thay thế, trong ví dụ của bạn là ${param%d}
  • subst ora_name_list_t - đó là bộ sưu tập được định nghĩa là TYPE ora_name_list_t IS TABLE OF VARCHAR2(2*(ORA_MAX_NAME_LEN+2)+1) , vì vậy bạn có thể chỉ định bất kỳ số lượng chuỗi nào để thay thế. Trong ví dụ này, tôi đã đặt str1 thành str5 .

Vì vậy, hàm này lặp lại các phần tử của bộ sưu tập đầu vào và thay thế bất kỳ chuỗi con nào khớp với mặt nạ mẫu đầu vào với giá trị từ bộ sưu tập này.

Kết quả:

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

Và cuối cùng sử dụng rec ban đầu của bạn :

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. Xác định xem có tồn tại ít nhất một hàng với điều kiện đã cho hay không

  2. Tự động xây dựng câu lệnh select trong Oracle 12c

  3. Làm cách nào để thực thi một hàm Oracle từ bên trong một biểu thức LINQ trong Entity Framework 4?

  4. Đọc một ĐẾN TỪ MỘT CẤU TRÚC được trả về bởi một thủ tục được lưu trữ

  5. Cài đặt để xem phần thời gian với ngày trong nhà phát triển Oracle PL / SQL là gì?