• Nie Znaleziono Wyników

Zajęcia nr III PL/SQL

N/A
N/A
Protected

Academic year: 2021

Share "Zajęcia nr III PL/SQL"

Copied!
11
0
0

Pełen tekst

(1)

PL/SQL

Zajęcia nr III

(2)

Instrukcje SQL w PL/SQL

• Instrukcje języka SQL są w PL/SQL są

analogiczne do oferowanych przez RDBMS Instrukcje dzielą się na związane z kursorami (SELECT + DML) oraz sterowaniem

transakcjami (COMMIT, ROLLBACK, SET

TRANSACTION, LOCK TABLE, SAVEPOINT)

• Kursory dzielą się na jawne (deklarowane przez

użytkownika) i niejawne – będące wywołaniami

poleceń SQL (w prawie identycznej postaci)

(3)

Kursor

Wykonaniu instrukcji SQL w RDBMS

towarzyszy zaalokowanie prywatnego obszaru roboczego, który jest buforem wykonania instrukcji i stanowi

udostępnienie danych pobieranych lub informacji o realizacji instrukcji.

Kursor, deklarowany w PL/SQL, jest

zmienną, którą można kojarzyć ze

zdaniem SQL – instrukcją PL/SQL.

(4)

Atrybuty kursora

Przetwarzaniu wierszy przez kursor (jawny lub nie) przez towarzyszą atrybuty, którym nadawane są odpowiednie wartości

kursor%FOUND - zawiera wartość BOOLEAN czy zaczytano kolejny wiersz

kursor%NOTFOUND - zawiera wartość BOOLEAN czy nie przechwycono wiersza

kursor%ISOPEN - zawiera wartość BOOLEAN czy kursor jest otwarty

kursor%ROWCOUNT – zawiera wartość NUMBER - liczba sprowadzonych wierszy

W przypadku kursora niejawnego nazwą kursora jest „SQL”

(5)

Kursory niejawne - wykorzystanie

Wybór pojedynczych danych (SELECT z klauzulą INTO)

Przykłady:

-- przykład 1 DECLARE

v_ename EMP.ename%TYPE;

n_sal EMP.SAL%TYPE := 5000;

BEGIN

SELECT ename INTO v_ename

FROM EMP

WHERE sal = n_sal;

DBMS_OUTPUT.PUT_LINE( v_ename );

END;

-- przykład 2 DECLARE

r_dept DEPT%ROWTYPE;

n_deptno DEPT.deptno%TYPE := 10;

BEGIN

SELECT *

INTO r_dept FROM DEPT

WHERE deptno = n_deptno;

DBMS_OUTPUT.PUT_LINE( r_dept.loc

||' - '

|| r_dept.dname );

Zadanie: END;

1. Wykonać przykład 1 z parameterem n_sal = 5000, a następnie z parametrem

n_sal = 3000 – ewentualne znalezienie większej ilości wierszy obsłużyć komunikatem –

„Znaleziono więcej niż jeden wiersz”

2. Wykonać przykład 2 z parameterem n_deptno = 10, a następnie z parametrem n_deptno = 50 – ewentualne nieznalezienie wierszy obsłużyć komunikatem –

„Nie znaleziono wiersza”

(6)

Kursory niejawne – wykorzystanie cd.

Polecenia DML

-- przykład 3 DECLARE

n_procent_podwyzki NUMBER := 10;

BEGIN

UPDATE NEW_EMP

SET sal = sal + n_procent_podwyzki/100 * sal;

DBMS_OUTPUT.PUT_LINE( 'Zmodyfikowano wierszy '

|| SQL%ROWCOUNT );

END;

Zadanie

1. Stworzyć tabelę NEW_EMP na podstawie EMP 2. Wykonać kod z przykładu 3

3. Zobaczyć zmiany 4. Wycofać zmiany

5. Zmodyfikować kod tak aby podnieść tylko osobom na stanowiskach ‘CLERK’

6. Zobaczyć zmiany

(7)

Kursory jawne

Służą do specyficznego przetwarzania większej ilości wierszy.

Deklaracja kursorów jawnych odbywa się w sekcji DECLARE Kursory mogą być otwierane instrukcją:

OPEN kursor[(parametry)];

Przechwytywanie kolejnych wierszy może odbywać się instrukcją:

FETCH kursor INTO zmienna[, zmienna..]*

Kursory mogą być zamykane instrukcją:

CLOSE kursor;

W celu sprawdzania, czy przechwycenie kolenego wiersza powidło się należy używać atrybutu kursora:

Kursor%FOUND lub Kursor%NOTFOUND

(8)

Kursory jawne, wykorzystanie

Postać kursorowa pętli FOR

-- przykład 4 DECLARE

CURSOR c_dept IS SELECT *

FROM DEPT;

r_dept DEPT%ROWTYPE;

BEGIN

FOR r_dept IN c_dept LOOP

DBMS_OUTPUT.PUT_LINE(

r_dept.deptno

|| ': '

|| r_dept.loc

|| ' - '

|| r_dept.dname );

END LOOP;

END;

-- przykład 5 BEGIN

FOR r_dept IN (

SELECT *

FROM DEPT

) LOOP

DBMS_OUTPUT.PUT_LINE(

r_dept.deptno || ': '

|| r_dept.loc

|| ' - '

|| r_dept.dname );

END LOOP;

END;

Zadanie:

1. Za pomocą pętli FOR wyświetlić nazwiska i

(9)

Jawna obsługa kursora

Zadanie

1. Wykonać kod z przykładu 6.

2. Zmienić inicjację n_sal na 6000.

3. Czy obsługa nieznalezienia wiersza jest lepsza niż w SELECT?

4. Wyświetlić nazwiska i pensje pracowników bez użycia pętli FOR.

-- przykład 6 DECLARE

v_ename EMP.ename%TYPE;

n_sal EMP.SAL%TYPE := 5000;

CURSOR c IS SELECT ename FROM EMP

WHERE sal = n_sal;

BEGIN OPEN c;

FETCH c INTO v_ename;

CLOSE c;

DBMS_OUTPUT.PUT_LINE( v_ename );

END;

(10)

Parametry kursorów jawnych

Kursory, w celu ich wielokrotnego użycia w bloku PL/SQL, są parametryzowalne:

Format parametru kursora w deklaracji:

CURSOR kursor[( zmienna TYP [DEFAULT wartość domyślna]

[, zmienna TYP [DEFAULT wartość domyślna] ]*

)] IS

SELECT ..

(11)

Parametry kursorów jawnych

-- przykład 7 DECLARE

v EMP.job%TYPE := 'CLERK';

CURSOR c( v_job EMP.job%TYPE DEFAULT v ) IS SELECT MAX( sal)

FROM EMP

WHERE job = v_job;

n EMP.sal%TYPE;

v_tekst varchar2(100) := 'największe zarobki na stanowisku ' ; BEGIN

OPEN c;

FETCH c INTO n;

CLOSE c;

DBMS_OUTPUT.PUT_LINE( v_tekst || v|| ' to ‘ || n );

v := 'MANAGER';

OPEN c( v ) ; FETCH c INTO n;

CLOSE c;

DBMS_OUTPUT.PUT_LINE( v_tekst || v|| ' to ‘ || n );

END;

Cytaty

Powiązane dokumenty

przedmiot złożony odebrać odebrać (art. 469 § 1 KC) Zatem zwolnienie dłużnika z zobowiązania w wyniku złożenia zwolnienie dłużnika z zobowiązania w wyniku złożenia

Należy uznać za poprawne wszystkie wyniki, które są konsekwencją przyjętych przez zdającego poprawnych zaokrągleń... czerwona

W równaniach reakcji, w których ustala się stan równowagi, brak „ ⇄” nie powoduje utraty punktów.. Elementy odpowiedzi umieszczone w nawiasach nie

Należy uznać za poprawne wszyst- kie wyniki, które są konsekwencją przyjętych przez zdającego po- prawnych zaokrągleń1. 1

katoda – stal lub gwóźdź stalowy. - Za napisanie wzoru trans-alkenu: Uznaje się każdy poprawny wzór, który przedstawia izomer trans. Jeśli zdający zapisze równanie reakcji

Każdy typ danych definiuje zbiór poprawnych wartości i zbiór operatorów, które mogą być zastosowany do zmiennej danego typu. Podtyp definiuje ten sam zbiór operatorów co jego typ

Cele wynikające z podstawy programowej: uczeń doskonali ciche czytanie ze zrozumieniem, wyszukuje w tekście informacje, dokonuje selekcji, Doskonali różne formy zapisywania

• W przypadku wystąpienia błędu odczytu rezultatem funkcji jest wartość EOF oraz ustawiany jest znacznik błędu strumienia... • Zapis pojedynczego znaku do