Daniel Jurak

Daniel Jurak analityk
programista,
architekt danych PKO
BP SA

Temat: [Oracle] struktura bloku

witam,
mam pytanko, chcialbym sobie pogrupować pewne zapytania.
np. skasowanie z tabeli po odpowiedniej dacie, dogranie nowych danych, select sprawdzajacy z dogranej tabeli.

w mysql to bylo proste,
tworze procedure, wrzucam do srodka
delete ... ;
insert into... ;
select... ;
potem wystarczylo call nazwa procedury i lecialo.

a jak to zrobic analogicznie w Oracle?
dzieki
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Daniel Jurak

Daniel Jurak analityk
programista,
architekt danych PKO
BP SA

Temat: [Oracle] struktura bloku

dzieki za linki, strukture znam :)

natomiast mam pytanko, czy w bloku (nie procedury),
mozna wykonac zwykle zapytanie select?


declare
V_DATA_W VARCHAR2(6) := '200901';
begin
delete from t_A where t_A.DATA_W = V_DATA_W;
insert into t_A (DATA_W, WARTOSC)
select t_B.DATA_W, sum(t_B.WARTOSC) WARTOSC from t_B where t_B.DATA_W = V_DATA_W group by t_B.DATA_W;

select t_A.DATA_W, count(*) from t_A group by t_A.DATA_W;
end;


oczywiscie delete i insert działaja prawidlowo,
natomiast select wymaga select into...
a ja potrzebuje, zwyklego selecta :)
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [Oracle] struktura bloku

A fakt.. bo Oracle jest "lepszy" ;)

http://www.dba-oracle.com/t_formatting_plsql_stored_pr...Bartosz Ślepowroński edytował(a) ten post dnia 13.02.09 o godzinie 12:38

Temat: [Oracle] struktura bloku

Nie da się zrobić zwykłego selecta w bloku.
Chyba, że koledzy odpowiedzą i udokumentują inaczej, chętnie się dowiem. :)
Pozdr.

Temat: [Oracle] struktura bloku

Bartosz Ślepowroński:
A fakt.. bo Oracle jest "lepszy" ;)

Eeee zaraz "lepszy", po prostu inny.
Zwykle po 3 systemie bazodanowym człowiek przestaje się dziwić.
Zresztą wiesz jak by Ci to powiedzieć ... binaria Oracle'a też jakiś developer pisał :-]] Pewnie nawet nie jeden ;-)

Rozumiem, ze ten select sprawdzający to takie "sprawdzenie" z użyciem interfejsu białkowego umiejscowionego między nosem a czołem ??
Znaczy usuwamy, wstawiamy i patrzymy co wyszło ?
I potem dopiero zatwierdzamy transakcje.
To fakt raczej się nie da wprost. Ale jeżeli ma to być "naocznie" sprawdzanie w interakcji z człowiekiem to czy konieczna jest procedura składowana w bazie ?
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [Oracle] struktura bloku

Andrzej P.:
Bartosz Ślepowroński:
A fakt.. bo Oracle jest "lepszy" ;)
Rozumiem, ze ten select sprawdzający to takie "sprawdzenie" z użyciem interfejsu białkowego umiejscowionego między nosem a czołem ??
Znaczy usuwamy, wstawiamy i patrzymy co wyszło ?
I potem dopiero zatwierdzamy transakcje.
To fakt raczej się nie da wprost. Ale jeżeli ma to być "naocznie" sprawdzanie w interakcji z człowiekiem to czy konieczna jest procedura składowana w bazie ?

Nie wiem co robi Daniela procedura, ale u mnie procedury sluza np do obrobki danych i wyplucia wyniku, a wynikiem jest jakis tam recordset. Ktory bywa wynikiem selecta z jakies tabeli @ albo #.Bartosz Ślepowroński edytował(a) ten post dnia 13.02.09 o godzinie 15:52
Daniel Jurak

Daniel Jurak analityk
programista,
architekt danych PKO
BP SA

Temat: [Oracle] struktura bloku

Bartosz Ślepowroński:

ale u mnie procedury sluza np do obrobki danych i wyplucia wyniku, a wynikiem jest jakis tam
recordset.

skonczyło sie na tym, ze procedura służy do skasowania poprzednich danych, przeliczenia i wrzucenia nowo przeliczonych danych do tabeli,

a sprawdzenie wykonuje, po prostu osobnym selectem po przetworzeniu procedury, i jeśli jest cos źle, wykonuje procedurę jeszcze raz :)

serdeczne dzieki za szybka pomoc

konto usunięte

Temat: [Oracle] struktura bloku

1. jesli robisz truncate + inserty to jesli nie wiesz, czy wstawiasz dobrze to moze warto zmienic podejscie?
2. sprawdzenie w postaci selecta rozumiem, ze select przelicza zbieznosc nowych danych z innymi juz istniejacymi? (nie wyobrazam sobie wrzucania przez procedure danych, ktore musze drugi raz sprawdzic w kontekscie tylko tych nowych danych).
3. zawsze select mozesz zastapic konstrukcja warunkowa, i zwracac 0 lub 1 jesli cos sie powiedzie, lub nie. przeciez to nie problem. i tak ominiesz te legendarne select .. into .. :)

a ogolnie - to bledne dane jak naprawiasz za pomoca kolejnego wywolania procedury? (to mnie w sumie ciekawi, bo blad pozostaje bledem przy stosowaniu tego samego algorytmu).
Marcin P.

Marcin P. Software Engineer /
PL/SQL Developer

Temat: [Oracle] struktura bloku

Po prostu w Oracle masz PL/SQL.
Piszesz procedurę i robisz podobnie.

Daniel Jurak:
witam,
mam pytanko, chcialbym sobie pogrupować pewne zapytania.
np. skasowanie z tabeli po odpowiedniej dacie, dogranie nowych danych, select sprawdzajacy z dogranej tabeli.

w mysql to bylo proste,
tworze procedure, wrzucam do srodka
delete ... ;
insert into... ;
select... ;
potem wystarczylo call nazwa procedury i lecialo.

a jak to zrobic analogicznie w Oracle?
dzieki
Łukasz K.

Łukasz K. 3AM software

Temat: [Oracle] struktura bloku

Daniel Jurak:
natomiast mam pytanko, czy w bloku (nie procedury),
mozna wykonac zwykle zapytanie select?


declare
V_DATA_W VARCHAR2(6) := '200901';
begin
delete from t_A where t_A.DATA_W = V_DATA_W;
insert into t_A (DATA_W, WARTOSC)
select t_B.DATA_W, sum(t_B.WARTOSC) WARTOSC from t_B where t_B.DATA_W = V_DATA_W group by t_B.DATA_W;

select t_A.DATA_W, count(*) from t_A group by t_A.DATA_W;
end;


oczywiscie delete i insert działaja prawidlowo,
natomiast select wymaga select into...
a ja potrzebuje, zwyklego selecta :)

Cóż... takie są założenia dla SELECTa wykonywanego w PL/SQLu, że musisz dane pobierać w jakieś miejsce (czy to do zmiennej, czy korzystając z kursora). Pewnym obejściem mogłoby tu być użycie dynamicznego SQLa i wywołanie SELECTa przez EXECUTE IMMEDIATE.
Nie rozumiem jednak, do czego takie zapytanie miałoby służyć - no bo po co pobierać dane, które do niczego nie są potrzebne? Ale to już nie moja sprawa :)Łukasz K. edytował(a) ten post dnia 08.03.09 o godzinie 22:49
Daniel Jurak

Daniel Jurak analityk
programista,
architekt danych PKO
BP SA

Temat: [Oracle] struktura bloku

Marek Karpowicz:
1. jesli robisz truncate + inserty to jesli nie wiesz, czy wstawiasz dobrze to moze warto zmienic podejscie?
Tak, przy powazniejszych skryptach jak najbardziej jest to stosowane. Poza tym nie robie truncate na tablicy, tylko delete ze zmienna, wiec kasowana jest tylko część danych :)
2. sprawdzenie w postaci selecta rozumiem, ze select przelicza zbieznosc nowych danych z innymi juz istniejacymi? (nie wyobrazam sobie wrzucania przez procedure danych, ktore musze drugi raz sprawdzic w kontekscie tylko tych nowych danych).
Select mial pokazac ile rekordow zostało dogranych, i jak to ma sie do poprzednich miesiecy, czy wielkość jest porownywalna itd itd
3. zawsze select mozesz zastapic konstrukcja warunkowa, i zwracac 0 lub 1 jesli cos sie powiedzie, lub nie. przeciez to nie problem. i tak ominiesz te legendarne select .. into .. :)
jasne, do samego sprawdzenia czy sie powiodlo tak, ale np czy ilosc dogranych danych jest porownywalna z poprzednimi miesiacami juz troche ciezej. a w przypadku tak prostego skryptu to chyba by bylo troche przerost formy nad trescia :)
a ogolnie - to bledne dane jak naprawiasz za pomoca kolejnego wywolania procedury? (to mnie w sumie ciekawi, bo blad pozostaje bledem przy stosowaniu tego samego algorytmu).
z zalozeniem, ze blad powoduja dane a nie algorytm (poniewaz ten jest sprawdzony na poprzednich miesiacach przeciez) :)Daniel Jurak edytował(a) ten post dnia 09.03.09 o godzinie 09:03

konto usunięte

Temat: [Oracle] struktura bloku

Ze względu na transakcyjność podany przez Ciebie ciąg instrukcji wykona się w całości lub zakończy się błędem.
ja bym to zrobił tak

DECLARE
d DATE := TO_DATE('01012009', 'DDMMYYYY');
BEGIN
DELETE FROM....... WHERE....;
DBMS_OUTPUT.PUT_LINE('Usunięto ' || SQL%ROWCOUNT || ' rekordów');
INSERT INTO ..... SELECT ..FROM .. WHERE ...;
DBMS_OUTPUT.PUT_LINE('Wstawiono ' || SQL%ROWCOUNT || ' rekordów';
COMMIT; --do przedyskutowania
EXCEPTION WHEN
OTHERS THEN
ROLLBACK; --zawsze tak robię
DBMS_OUTPUT.PUT_LINE('Błąd ' || SQLERRM);
END;

Po wykonaniu widać przyrost danych lub komunikat o błędzie.
Należy zwrócić uwagę, że transakcyjność nie działa dla polecenia TRUNCATE. EXECUTE IMMEDIATE 'TRUNCATE TABLE nazwa_tabeli' jest nieodwracalne. TRUNCATE jest szybki, ale trzeba byc pewnym, że chcemy nieodwracalnie usunąć daneKazik Szkaradnik edytował(a) ten post dnia 10.03.09 o godzinie 00:10
Daniel Jurak

Daniel Jurak analityk
programista,
architekt danych PKO
BP SA

Temat: [Oracle] struktura bloku

Kazik Szkaradnik:
EXCEPTION WHEN
OTHERS THEN
ROLLBACK; --zawsze tak robię

Dzieki za info. Wczesniej pracowalem na mysqlu i z transakcyjnoscia oraz wyjatkami to mialem niewiele do czynienia. Musze na to bardziej zwracac uwage :)
Łukasz K.

Łukasz K. 3AM software

Temat: [Oracle] struktura bloku

Tak trochę obok głównego pytania: do nauki PL/SQLa polecam PL/SQL Programming Stevena Feuersteina i Billa Pribyla ( http://www.amazon.com/Oracle-PL-SQL-Programming-4th/dp... ). Jest to dość konkretna cegła, ale ładnie pogłębia i porządkuję dotychczasową wiedzę.
Daniel Jurak

Daniel Jurak analityk
programista,
architekt danych PKO
BP SA

Temat: [Oracle] struktura bloku

Thx, ostatnio kupiłem http://www.amazon.com/Oracle-Database-10g-SQL-Programm... z tym ze książke mam w domu, a oracle w pracy ;) Czas to zmienic :)
Mariusz Masewicz

Mariusz Masewicz Prawie wszysko o
bazach danych Oracle
:-)

Temat: [Oracle] struktura bloku

Daniel Jurak:
Thx, ostatnio kupiłem http://www.amazon.com/Oracle-Database-10g-SQL-Programm... z tym ze książke mam w domu, a oracle w pracy ;) Czas to zmienic :)

http://docs.oracle.com - jest wszedzie,
podobnie jak:
http://otn.oracle.com
http://google.com
:-)

konto usunięte

Temat: [Oracle] struktura bloku

Kazik Szkaradnik:
EXCEPTION WHEN
OTHERS THEN
ROLLBACK; --zawsze tak robię
DBMS_OUTPUT.PUT_LINE('Błąd ' || SQLERRM);
END;

Probowałeś kiedyś debugowac taki kod, który został napisany przez kogoś innego ? Zwłaszcza, gdy BEGIN-END-EXCEPTION obejmuje wiele instrukcji, które mogą taki wyjątek rzucić ?

DBMS_OUTPUT wyświetli ci tylko ostatnią linijkę ze stosu błędów i na dodatek ... w praktyce nie będzie błędu. Jeśli ktoś nie włączy "serveroutput'a", to będzie przeświadczony, że kod wykonał się bez błędu. A potem zejdzie mu mnóstwo czasu na dojście do tego, że być może jednak gdzieś ten błąd jest, ale z jakiegoś powodu go nie ma :) A potem ... zakomentuje całe EXCEPTION i zobaczy gołą prawdę.

Po DBMS_OUTPUT powinien być jeszcze conajmniej RAISE.

Generalnie DBMS_OUTPUT ma/może służyć do wyświetlania informacji diagnostycznych, a nie do obsługi błędu.

To co "zawsze robisz" to chowanie głowy w piasek i ukrywanie 90% błędów. Aż do momentu, kiedy komuś w oczy nie rzuci się w oczy niezgodność w danych.

konto usunięte

Temat: [Oracle] struktura bloku

Apropo problemu autora watku.
jesli chodzi Ci tylko o wyswietlenie wynikow mozesz stworzyc kursor i poprostu wyswietlic wyniki, cos takiego:
declare 
cursor c is select * from s;
begin
for i in c loop
dbms_output.put_line(i.d);
end loop;
end;


pozatym mozna stworzyc funkcje zwracajaca tabele jako wynikWojciech Młodzianowski edytował(a) ten post dnia 08.07.10 o godzinie 15:25
Daniel Jurak

Daniel Jurak analityk
programista,
architekt danych PKO
BP SA

Temat: [Oracle] struktura bloku

Wojciech Młodzianowski:
pozatym mozna stworzyc funkcje zwracajaca tabele jako wynik[edited]Wojciech Młodzianowski edytował(a) ten post dnia

dzieki, dzieki, juz sobie doczytalem o kursorach, wyjatkach ;)
chociaz odgornie mam powiedziane, aby raczej kursorow nie uzywac, ze wzgledu na dosc duze ilosc danych.

Następna dyskusja:

Tworzenie joba w bloku zamk...




Wyślij zaproszenie do