Problem z Funkcją w SQL- Insert a potem Select

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.

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

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

1

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

INSERT INTO t1 VALUES (t1_seq.nextval, 'FOUR')
  RETURNING id INTO l_id;
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.

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;

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.

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1