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

Tách chuỗi được phân tách bằng dấu phẩy trong một chương trình được lưu trữ PL / SQL

Điều này sẽ làm những gì bạn đang tìm kiếm .. Nó giả định rằng danh sách của bạn sẽ luôn chỉ là những con số. Nếu không đúng như vậy, chỉ cần thay đổi các tham chiếu đến DBMS_SQL.NUMBER_TABLE thành một loại bảng hoạt động cho tất cả dữ liệu của bạn:

CREATE OR REPLACE PROCEDURE insert_from_lists(
    list1_in IN VARCHAR2,
    list2_in IN VARCHAR2,
    delimiter_in IN VARCHAR2 := ','
)
IS 
    v_tbl1 DBMS_SQL.NUMBER_TABLE;
    v_tbl2 DBMS_SQL.NUMBER_TABLE;

    FUNCTION list_to_tbl
    (
        list_in IN VARCHAR2
    )
    RETURN DBMS_SQL.NUMBER_TABLE
    IS
        v_retval DBMS_SQL.NUMBER_TABLE;
    BEGIN

        IF list_in is not null
        THEN
            /*
            || Use lengths loop through the list the correct amount of times,
            || and substr to get only the correct item for that row
            */
            FOR i in 1 .. length(list_in)-length(replace(list_in,delimiter_in,''))+1
            LOOP
                /*
                || Set the row = next item in the list
                */
                v_retval(i) := 
                        substr (
                            delimiter_in||list_in||delimiter_in,
                            instr(delimiter_in||list_in||delimiter_in, delimiter_in, 1, i  ) + 1,
                            instr (delimiter_in||list_in||delimiter_in, delimiter_in, 1, i+1) - instr (delimiter_in||list_in||delimiter_in, delimiter_in, 1, i) -1
                        );
            END LOOP;
        END IF;

        RETURN v_retval;

    END list_to_tbl;
BEGIN 
   -- Put lists into collections
   v_tbl1 := list_to_tbl(list1_in);
   v_tbl2 := list_to_tbl(list2_in);

   IF v_tbl1.COUNT <> v_tbl2.COUNT
   THEN
      raise_application_error(num => -20001, msg => 'Length of lists do not match');
   END IF;

   -- Bulk insert from collections
   FORALL i IN INDICES OF v_tbl1
      insert into tmp (a, b)
      values (v_tbl1(i), v_tbl2(i));

END insert_from_lists; 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi khi tải oci8.so với máy chủ Ubuntu 17.04 php 7 và apache2

  2. Khôi phục tệp trình soạn thảo SQL (Truy vấn, thủ tục) Sau khi bắt cóc đối với sự cố hoặc treo Oracle

  3. ORA-01843 không phải là tháng hợp lệ- So sánh Ngày

  4. Các ràng buộc khóa ngoại có ảnh hưởng đến việc chuyển đổi truy vấn trong Oracle không?

  5. Ghi lại với ngày tối đa