Problem z Funkcją w SQL- Insert a potem Select

Problem z Funkcją w SQL- Insert a potem Select
K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Cześć, mam problem z napisaniem funkcji w oracle sql. Chciałem napisać funkcję aby najpierw dodała do bazy adres, a następnie pobrała id tego rekordu.
Wyskakuje mi błąd ORA-14551: nie można wykonać operacji DML wewnątrz zapytania.

Kopiuj
CREATE FUNCTION dodaj_adres_pobierz_id(ulica VARCHAR2,numer_budynku NUMBER, numer_mieszkania NUMBER, miejscowosc VARCHAR2, kod_pocztowy VARCHAR2, poczta VARCHAR2, wojewodztwo_id NUMBER)
   RETURN NUMBER 
   IS 
   result NUMBER(12,0); 
   output NUMBER(12,0); 
   BEGIN 
        INSERT INTO adresy VALUES(identyfikor_adresy.NEXTVAL,ulica,numer_budynku,numer_mieszkania,miejscowosc,kod_pocztowy,poczta,wojewodztwo_id);
        SELECT adres_id INTO output FROM adresy WHERE adres_ulica = ulica;
      RETURN(output);     
    END dodaj_adres_pobierz_id;
/
SH
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 109
0

Sekwencer pobierz przez kursor albo select into do zmiennej i wtedy podstaw do inserta.

XY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 260
1

A jak ta funkcja jest wołana?
Poza tym ten select w funkcji jest słaby, bo można robić np.

Kopiuj
INSERT INTO t1 VALUES (t1_seq.nextval, 'FOUR')
  RETURNING id INTO l_id;
K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0
xy napisał(a):

A jak ta funkcja jest wołana?
Poza tym ten select w funkcji jest słaby, bo można robić np.

Kopiuj
INSERT INTO t1 VALUES (t1_seq.nextval, 'FOUR')
  RETURNING id INTO l_id;

Tak ją wywołuję:
SELECT dodaj_adres_pobierz_id('Armii Krajowej',25,null,'Częstochowa','00-000','Częstochowa',5) FROM DUAL;

SH
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 109
0

https://stackoverflow.com/questions/8729236/solution-to-cannot-perform-a-dml-operation-inside-a-query

Czyli autonomiczna transkacja, ale to jest trochę słabe. Inaczej trzeba to rozbić najpierw na procedure która insertuje, a później wywołanie funkcji w select która pobierze ID.

XY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 260
0

Czyli problemem jest sposób wywołania (select ... from dual). Pomysł z transakcją autonomiczną jest raczej "w poprzek", bo przypuszczalnie chodzi tu o wstawienie powiązanych wierszy w różnych tabelach w jednej transakcji.
Po prostu trzeba podstawić wynik do zmiennej normalnie, w PL/SQL jest pokazane w 2. odpowiedzi w poprzednim linku, a jak musi być SQL, to chyba tutaj jest składnia z "bind variables" (var ...): http://dba-oracle.com/t_ora_14551_cannot_perform_a_dml_operation_inside_a_query.htm

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.