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

Kursor Oracle do przypisania

Ustaw typy danych i funkcje pomocnicze:

CREATE TYPE string_list JEST TABELĄ VARCHAR2(2);/CREATE TYPE int_list JEST TABELĄ INT;/CREATE TYPE t1_data AS OBJECT( vk VARCHAR2(4), ay VARCHAR2(2), an VARCHAR2(14) , r INT, c VARCHAR2(2));/UTWÓRZ TYP t1_table JEST TABELĄ t1_data;/UTWÓRZ LUB ZAMIEŃ FUNKCJĘ split_String( i_str IN VARCHAR2, i_delim IN VARCHAR2 DEFAULT ',') RETURN string_list DETERMINISTICAS p_result string_list( :=) p_start LICZBA(5) :=1; p_end NUMER(5); c_len STAŁA LICZBA(5) :=DŁUGOŚĆ( i_str ); c_ld CONSTANT NUMBER(5) :=LENGTH( i_delim );BEGIN -- https://stackoverflow.com/a/35577315/1509264 -- Licencja:CC BY-SA 4.0 JEŻELI c_len> 0 TO p_end :=INSTR( i_str, i_delim, p_start ); PODCZAS p_end> 0 PĘTLA p_result.EXTEND; p_result( p_result.COUNT ) :=SUBSTR( i_str, p_start, p_end - p_start ); p_start :=p_koniec + c_ld; p_end :=INSTR( i_str, i_delim, p_start ); PĘTLA KOŃCOWA; JEŻELI p_start <=c_len + 1 TO p_result.EXTEND; p_result( p_result.COUNT ) :=SUBSTR( i_str, p_start, c_len - p_start + 1 ); KONIEC JEŚLI; KONIEC JEŚLI; RETURN p_result;END;/ 

Następnie możesz użyć funkcji:

<>CREATE FUNCTION wartości_wybrane RETURN tabela_t1 PIPELINEDIS TYP typ_t2 IS TABELA t2%ROWTYPE; t2_data t2_type;BEGIN -- https://stackoverflow.com/a/67398434/1509264 -- Licencja:CC BY-SA 4.0 SELECT * BULK COLLECT INTO t2_data FROM t2; FOR cur IN ( SELECT * FROM t1 ORDER BY r ) LOOP DECLARE a_freqs INT_LIST :=INT_LIST(); cum_freq INT :=0; wzięto STRING_LIST :=SPLIT_STRING( cur.an, ', ' ); idx INT; c T2.A%TYP; BEGIN a_freqs.EXTEND(t2_data.COUNT); FOR i IN 1 .. t2_data.COUNT LOOP JEŻELI ( t2_data(i).a =cur.ay AND t2_data(i).c> 0 ) OR ( cur.ay JEST NULL AND t2_data(i).a NIE JEST CZŁONKIEM AND t2_data(i).c> 0 ) THEN a_freqs(i) :=cum_freq + t2_data(i).c; cum_freq :=cum_freq + t2_data(i).c; ELSE a_freqs(i) :=cum_freq; KONIEC JEŚLI; PĘTLA KOŃCOWA; JEŻELI częst_liczba> 0 TO idx :=PODŁOGA(DBMS_RANDOM.WARTOŚĆ(0, częst_nam)); FOR i IN 1 .. t2_data.COUNT PĘTLA JEŻELI idx

Co dla przykładowych danych:

CREATE TABLE t1 (vk, ay, an, r) jako wybierz „VK1”, null, „A1, A2”, 1 z podwójnej unii wszystkie wybierz „VK2”, null, null, 2 z podwójnej unii wszystkie wybierz 'VK3', null, 'A1, A2, A3, A4', 3 z dual union wszystkie wybierz 'VK4', null, 'A2', 4 z dual union wszystkie wybierz 'VK5', null, null, 5 z dual union wszystkie wybierz 'VK6', null, null, 6 z dual union wszystkie wybierz 'VK7', 'A3', null, 7 z dual union wszystkie wybierz 'VK8', null, null, 8 z dual union wszystkie wybierz 'VK9 ', null, null, 9 z dual union wszystkie wybierz 'VK10', null, null, 10 z dual union wszystkie wybierz 'VK11', null, null, 11 z dual union wszystkie wybierz 'VK12', null, null, 12 z dual union wszystkie wybierz 'VK13', 'A3', null, 13 z dual union wszystkie wybierz 'VK14', null, null, 14 z dual union wszystkie wybierz 'VK15', 'A3', null, 15 z dual union wszystkie wybierz 'VK16', null, null, 16 z podwójnej unii wszystko wybierz 'VK17', null, null, 17 z podwójnej unii wszystko wybierz 'VK18', null, null, 18 z podwójnej unii wszystko wybierz „VK19”, null, null, 19 z podwójnej unii wszystko wybierz „VK20”, null, null, 20 z podwójnej; UTWÓRZ TABELĘ t2 (a, c) jako wybierz „A1”, 4 z podwójnej unii wszystko wybierz „A2” , 10 z podwójnej unii wszystkie wybierz 'A3', 2 z podwójnej unii wszystkie wybierz 'A4', 10 z podwójnej; 

Następnie:

WYBIERZ * Z PICK_VALUES(); 

Majowe wyjście:

VK AY AN R C VK1A1, A21A4VK22A2VK3A1, A2, A3, A43VK4A24A1VK55A2VK66A2VK7A37A3VK88A1VK99A2VK1010A4VK1111A2VK1212A1VK13A313A3VK1414K191817A4VK4VK1414K191816A4VK4VK1414K191817A4VK4

db<>graj tutaj




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Niesamowite pytania do rozmowy kwalifikacyjnej z 24 równoległymi menedżerami

  2. Jaka jest różnica między USER() a SYS_CONTEXT('USERENV','CURRENT_USER')?

  3. Oracle PL/SQL - Jak stworzyć prostą zmienną tablicową?

  4. Jak uzyskać ostatni dzień miesiąca w Oracle?

  5. Obróć na Oracle 10g