Funkcja - query batch

0

Szanowni forumowicze, mam problem z funkcja :

CREATE FUNCTION wielka() RETURNS TRIGGER AS '
BEGIN
NEW.imie = initcap(NEW.imie);
NEW.nazwisko= initcap(NEW.nazwisko);
RETURN NEW;
END;
' LANGUAGE 'plpgsql';

FOR EACH ROW EXECUTE PROCEDURE wielka();
SELECT noclegi.id_noclegu,wlasciciel.imie,wlasciciel.nazwisko,wlasciciel.pesel FROM noclegi,wlasciciel
WHERE noclegi.id_noclegu=wlasciciel.id_noclegu AND rodzaj='Hotel');
SELECT noclegi.id_noclegu,
noclegi.nazwa,noclegi.rodzaj,rezerwacje.nr_pokoju,rezerwacje.ile_osobowy,rezerwacje.lazienka,
cennik_rezerwacji.cena
FROM noclegi,rezerwacje,cennik_rezerwacji
WHERE noclegi.id_noclegu=rezerwacje.id_noclegu AND rezerwacje.kod_pokoju=cennik_rezerwacji.kod_pokoju
ORDER BY noclegi.id_noclegu
);

Caly czas dostaje komunikat : 'CREATE FUNCTION' must be the first statement in a query batch.

Probowalem juz 'GO' na koncu i niestety nic to nie daje. Czy ktos moglby mi podrzucic jakis poradnik jak to rozwiazac?

0

Ale napisz, co chcesz zrobić i w jakiej bazie danych, bo chyba coś ci się pokręciło...

0

Racja, bazę też powinienem dodać:

CREATE TABLE noclegi(
id_noclegu INTEGER identity (1, 1), 
kod_wlasciciela INTEGER NOT NULL,
nazwa TEXT NOT NULL,
rodzaj TEXT NOT NULL
);

CREATE TABLE info(
id_noclegu INTEGER NOT NULL,
ile_gwiazdek INTEGER,
preferencje TEXT
);

CREATE TABLE rezerwacje(
id_noclegu INTEGER NOT NULL,
kod_pokoju INTEGER NOT NULL,
nr_pokoju INTEGER NOT NULL,
ile_osobowy INTEGER NOT NULL,
lazienka VARCHAR(3) NOT NULL
);

CREATE TABLE szcz_rezerwacje(
kod_pokoju INTEGER NOT NULL,
zajety VARCHAR(3),
do_kiedy DATE);

CREATE TABLE cennik_rezerwacji (
kod_pokoju INTEGER NOT NULL,

cena REAL NOT NULL

);


CREATE TABLE wlasciciel(

kod_wlasciciela INTEGER NOT NULL,

id_noclegu INTEGER NOT NULL,

imie TEXT NOT NULL,

nazwisko TEXT NOT NULL,

PESEL VARCHAR(11) NOT NULL

);

CREATE TABLE posilki(

id_noclegu INTEGER NOT NULL,

id_posilku INTEGER NOT NULL,

rodzaj TEXT NOT NULL,

dostepnosc VARCHAR(3) NOT NULL

);

CREATE TABLE lokalizacja(

id_noclegu INTEGER NOT NULL,

pkp VARCHAR(12),

pks VARCHAR(12),

lotnisko VARCHAR(12)

);


CREATE TABLE adresy(

id_noclegu INTEGER NOT NULL,
wojewodztwo TEXT NOT NULL,

miejscowosc TEXT NOT NULL,

ulica   TEXT NOT NULL,

nr      VARCHAR(5) NOT NULL,

kod_pocztowy VARCHAR(6) NOT NULL

);


CREATE TABLE telefony(

kod_wlasciciela INTEGER NOT NULL,

numer INTEGER NOT NULL

);
ALTER TABLE noclegi ADD PRIMARY KEY (id_noclegu);
ALTER TABLE info ADD PRIMARY KEY (id_noclegu);
ALTER TABLE rezerwacje ADD PRIMARY KEY (id_noclegu, kod_pokoju);
ALTER TABLE cennik_rezerwacji ADD PRIMARY KEY (kod_pokoju);
ALTER TABLE wlasciciel ADD PRIMARY KEY (kod_wlasciciela);
ALTER TABLE posilki ADD PRIMARY KEY (id_posilku);
ALTER TABLE lokalizacja ADD PRIMARY KEY(id_noclegu);
ALTER TABLE adresy ADD PRIMARY KEY (id_noclegu);
ALTER TABLE telefony ADD PRIMARY KEY (kod_wlasciciela);
ALTER TABLE szcz_rezerwacje ADD PRIMARY KEY (kod_pokoju);
ALTER TABLE wlasciciel ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu)
ON UPDATE CASCADE;
ALTER TABLE info ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu)
ON UPDATE CASCADE;
ALTER TABLE rezerwacje ADD FOREIGN KEY (kod_pokoju) REFERENCES cennik_rezerwacji(kod_pokoju)
ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE rezerwacje ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu)
ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE telefony ADD FOREIGN KEY (kod_wlasciciela) REFERENCES wlasciciel(kod_wlasciciela)
ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE lokalizacja ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu)
ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE adresy ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu)
ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE posilki ADD FOREIGN KEY (id_noclegu) REFERENCES noclegi(id_noclegu)
ON UPDATE CASCADE;
ALTER TABLE rezerwacje ADD FOREIGN KEY (kod_pokoju) REFERENCES szcz_rezerwacje(kod_pokoju)
ON UPDATE CASCADE;
ALTER TABLE posilki ADD CHECK (dostepnosc IN ('TAK','NIE'));
ALTER TABLE rezerwacje ADD CHECK (lazienka IN ('TAK','NIE'));
ALTER TABLE cennik_rezerwacji ADD CHECK (cena>0);

Wśród dodatkowych pytań: SQL express 2014 nie obsługuje zmiennych typu serial, czy zastąpienie tego identity(1,1) spowoduje mi autoinkrementację klucza głównego?

0

No widzisz, dajesz kod funkcji triggera z postgreSQL, a bazę tworzysz w MS SQL. o się nie może udać.
Nadal jednak nie wyjaśniłeś o co ci chodzi. Z opisu funkcji domyślam się, żeby zamieniać imię i nazwisko z pierwszej wielkiej litery. Chyba nie ma takiej funkcji w MS SQL Na stacku gdzieś widziałem.
A z grubsza identity(1,1) działa tak samo jak serial w postgreSQL. Z grubsza, bo diabeł tkwi w szczegółach (w mnie w postgreSQL jest to lepiej rozwiązane).

0

Ok, rozumiem, czyli mój problem jest częściowo rozwiązany. Co należy zmienić żeby mieć to w czystym SQL?

0

Dwie kwestie

  1. Tworzenie triggera w MsSQL ma inną składnie https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017
  2. Nie ma funkcji initcap, trzeba ja samemu napisać, lub poszukać na necie

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