SQL-miljö

34
SQL-miljö Standard SQL * Interaktiv * Embedded - statisk - dynamisk - moduler CLI (Call Level Interface) JDBC, SQLJ Java Interface

description

SQL-miljö. Standard SQL *Interaktiv *Embedded -statisk -dynamisk -moduler CLI (Call Level Interface) JDBC, SQLJ Java Interface. Standard embedded statisk SQL. Ett programmeringsspråk (värdspråk) använder sig av SQL för att kommunicera med en relationsadatabas. - PowerPoint PPT Presentation

Transcript of SQL-miljö

Page 1: SQL-miljö

SQL-miljö

Standard SQL* Interaktiv * Embedded

- statisk- dynamisk- moduler

CLI (Call Level Interface)

JDBC, SQLJ Java Interface

Page 2: SQL-miljö

Standard embedded statisk SQL

Ett programmeringsspråk (värdspråk) använder sig av SQL för att kommunicera med en relationsadatabas.

Värdspråket kan vara:• ADA• C• COBOL• FORTRAN• PASCAL• PL/1

Page 3: SQL-miljö

Pascal-programmed ’inbakad’SQL

Pre-processor

För-kompilering

Ev. fel-meddelanden

PrepareratPascal-program

Pascal-kompilator

Kompile-ring

Ev. fel-meddelanden

Exekverbartprogram

Page 4: SQL-miljö

Pascal-program

EXEC SQL

;

EXEC SQL

;

EXEC SQL

;

SQL-satser

Page 5: SQL-miljö

När SQL kommunicerar med ett annat språk,måste följande problem beaktas:

1 Dataöverföring mellan programvariabler i SQL och värdspråket

2 Felhantering

3 Bearbetning av en tuppel i taget

Page 6: SQL-miljö

Exempeldatabas

Department(dnumber, dname, dmgr)Employee(enumber, ename, dnumber)Project(pnumber, pname, dnumber)Works(enumber, pnumber, hours)

Department.dmgr << Employeer.enumberEmployee.dnumber << Department.dnumberProject.dnumber << Department.dnumberWorks.enumber << Employee.enumberWorks.pnumber << Project.pnumber

Page 7: SQL-miljö

1 Dataöverföring

Berörda variabler deklareras i en särskildsektion i värdspråket

Ex.EXEC SQL BEGIN DECLARE SECTION;TYPE str4=PACKED ARRAY[1..4] OF CHAR; str20 = PACKED ARRAY[1..20] OF CHAR;

emptyp = RECORDenumber:str4;enamn:str20;dnumber:str4

END;VAR emprecord:emptyp;EXEC SQL END DECLARE SECTION;

Page 8: SQL-miljö

2 Felhantering

SQLCA (SQL Communication Area)

Innehåller ett antal variabler för meddelanden ochstatusinformation till värdspråket.

Varje databasanrop påverkar SQLCA.

Skall ej deklareras!

Införlivas i programmet med:

EXEC SQL INCLUDE SQLCA;

Page 9: SQL-miljö

SQLCA innehåller 128 tecken

Pos 1 - 12 okänt 13 - 16 SQLCODE 17 - 88 SQLERRM 89 - 112 okänt 113 - 120 SQLWARN 121 - 128 okänt

SQLCODE = 0 OK < 0 Fel > 0 OK med reservation +100 Data saknas

Page 10: SQL-miljö

Felhantering med hjälp av SQLCA

1 WHENEVER-sats

2 Test av SQLCODE

1 EXEC SQL WHENEVER <villkor> <åtgärd>;

Villkor: Åtgärd:- SQLERROR - CONTINUE- SQLWARNING - STOP- SQLMESSAGE - GO TO <satsnummer>- NOT FOUND

Ex. EXEC SQL WHENEVER SQLWARNING CONTINUE;

Page 11: SQL-miljö

2 Test av SQLCODE

Ex.

- IF SQLCODE < 0 THEN GO TO . . .

- WHILE SQLCODE = 0 DO . . .

- IF SQLCODE = NOT FOUND . . .

Page 12: SQL-miljö

3 Bearbetning

Databasen öppnas respektive stängs med:

EXEC SQL CONNECT <databasnamn>;. . .. . .

EXEC SQL DISCONNECT;

Page 13: SQL-miljö

Överföring av en enstaka rad från en tabell(Singleton Select)

Ex.EXEC SQL

SELECT enumber, enamn, dnumberINTO :enr, :ename, :dnumberFROM EmployeeWHERE enumber = ’4410’;

alternativt.

EXEC SQLSELECT * INTO :emprecordFROM EmployeeWHERE enumber = ’4410’;

Page 14: SQL-miljö

På samma sätt kan man göra INSERT, UPDATE eller DELETE av enstaka rader.

Det går även att uppdatera flera rader medUPDATE eller DELETE

Ex.EXEC SQL

UPDATE WorksSET hours = NULLWHERE pnumber = ’1008’;

Ex.EXEC SQL DELETE FROM Project;

Page 15: SQL-miljö

Överföring av mer än en rad löses med cursor,en markör som pekar ut och behandlar en rad i taget.

Ex.Hämta alla projekt och skriv ut nummer, namn och totalt antal timmar för varje projekt.

I deklarationsdelen av Pascalprogrammet skrivs:

EXEC SQL INCLUDE SQLCA;

Pascalvariabler som har kontakt med SQLvariablerdeklareras i DECLARE SECTION.

EXEC SQL BEGIN DECLARE SECTION;VAR pno:PACKED ARRAY[1..4] OF CHAR; project:PACKED ARRAY[1..20] OF CHAR; hours:SMALLINT;EXEC SQL END DECLARE SECTION;

Page 16: SQL-miljö

BeginEXEC SQL

DECLARE ptime CURSOR FORSELECT pnumber, pname, SUM(hours)FROM Project, WorksWHERE Project.pnumber = Works.pnumberGROUP BY Project.pnumber, pname;

. . .EXEC SQL OPEN ptime;. . .EXEC SQL FETCH ptime INTO :pno, :project, :hours;While SQLCODE = 0 DoBegin

Writeln(pno, project, hours:5);EXEC SQL FETCH ptime

INTO :pno, :project, :hours;End;. . .EXEC SQL CLOSE ptime;

. . .End.

Ex forts.

Page 17: SQL-miljö

Vid uppdatering med cursor lägger man tillFOR UPDATE i cursor-deklarationen

Ex.

EXEC SQL DECLARE w CURSOR FORSELECT enumber, pnumber, hoursFROM WorksWHERE pnumber = : pnumFOR UDATE OF hours;

Page 18: SQL-miljö

Exempel med två cursor

Hämta nummer och namn på varje avdelning samt nummer och namn på de anställda inom varje avdelning och skriv ut dessa uppgifter.

Begin…EXEC SQL DECLARE d CURSOR FOR

SELECT dnumber, dname FROM Department;EXEC SQL DECLARE e CURSOR FOR

SELECT enumber, enam FROM EmployeeWHERE dnumber = :depno;

EXEC SQL WHENEVER SQLERROR GO TO 99;EXEC SQL CONNECT ”company”;EXEC SQL OPEN d;. . .EXEC SQL FETCH d INTO :depno, : depname;While SQLCODE = 0 Do

forts.

Page 19: SQL-miljö

Begin Writeln(”Department: ”, depno, ” ”, depname); Writeln(”Empno”, ” Empname”; EXEC SQL OPEN e; EXEC SQL FETCH e INTO :eno, :ename; While SQLCODE = 0 Do Begin Writeln(eno, ” ”, ename); EXEC SQL FETCH e INTO :eno, :ename;

End;EXEC SQL CLOSE e;

Writeln; EXEC SQL FETCH d INTO :depno, depname;End;. . .EXEC SQL CLOSE d;EXEC SQL DISCONNECT;. . .

End.

Ex forts.

Page 20: SQL-miljö

Embedded dynamisk SQL

Tre steg:• Generera SQL-sats• Kompilera (preparera)• Exekvera

ev. i ett steg}

Ex. . . .VAR inmatning : CHAR(1000);. . .inmatning := ’DELETE FROM Employee WHERE enumber = ’0025’;EXEC SQL PREPARE SQLPREPPED FROM :inmatning;EXEC SQL EXECUTE SQLPREPPED;. . .

Page 21: SQL-miljö

. . .

VAR inmatning : Char(1000);. . .

Writeln(’Ange din SQL-sats: ’);Readln(inmatning);EXEC SQL EXECUTE IMMEDIATE :inmatning;If SQLCODE = 0 Then

Writeln (’Rätt’)Else Writeln (’Fel’);

. . .

Alternativt ex.

Page 22: SQL-miljö

Placeholders

. . .Inmatning:= ’SELECT enumber FROM Works

WHERE hours < ?’;EXEC SQL PREPARE SQLPREPPED FROM :inmatning;. . .hmin:= 5;EXEC SQL EXECUTE SQLPREPPED USING :hmin;. . .

Ex.

Page 23: SQL-miljö

SQLDA

En datastruktur som används för att transportera data mellan applikationsprogrammet och databasen.SQLDA innehåller en räknare och ett antal variabler med information om bl a kolumner, datatyper och värden.

SQLDA är inte officiell standard, men stöds av de flestaSQL-produkter.

Page 24: SQL-miljö

Jämförelse mellan statisk och dynamisk SQL

Embedded statisk SQL

+ Färdigkompilerad programkod - SQL-satserna måste vara med optimerad accessväg ger definierade från början snabb exekvering

Embedded dynamisk SQL

+ Mer flexibel än statisk SQL - Tar vanligtvis längre tid Databasobjekten behöver inte att exekvera, eftersom existera före exekveringen frågorna optimeras vid

körningen

Page 25: SQL-miljö

Moduler

En modul är ett separatkomplierat program som innehålleren eller flera procedurer.Varje procedur innehåller en enda SQL-sats.

Ex.MODULE projectmodule;LANGUAGE Pascal;AUTHORIZATION Stina;PROCEDURE find_project (SQLCODE, :pno Character(4), :pname Character(20)) SELECT pname INTO :pname FROM Project WHERE pnumber = :pno;. . .PROCEDURE del_project. . . ;PROCEDURE new_project. . . ;

Page 26: SQL-miljö

Ex. forts.

I Pascal

. . .VAR number, pno: Packed Array[1..4] Of Char;

pname : Packed Array[1..20] Of Char;returncode: Integer;

. . .Begin

. . .Write(’Ange projektnummer: ’);Readln(number);pno := number;Call find_project(returncode, pno, pname);If returncode = 0 Then Writeln(’Projektets namn är: ’, pname)Else . . .. . .

End.

Page 27: SQL-miljö

Call Level Interface

Ett applikationsprogram använder sig av CLI-rutiner för att genomföra SQL-operationer.Vilka rutiner som ska användas bestäms dynamiskt.CLI innefattar en mängd rutiner (routins).En rutin är antingen en funktion eller en procedur.

Exempel på rutiner:Cancel GetCursorNameCloseCursor GetConnectAttrrConnect GetTypeInfoDisconnect PrepareExecute PutDataFetch SetCursorName

Page 28: SQL-miljö

CLI Descriptor Areas

Har samma funktion som SCLDA i dynamisk SQL.

Skillnad:

SQLDA innehåller aktuella datavärden

CLIDA innehåller pekare till variabler som innehåller sådana värden

Page 29: SQL-miljö

Många anser att CLI utgör ett ”renare” gränssnittmot SQL.

Följande är hämtat ur The SQL Standard avC J Date / H Darwen, 1997:

”CLI actually represents a better approach to theproblem than dynamic SQL does. For this reasonit is probably true to say that dynamic SQL wouldnever have been included in the standard at all ifCLI had been defined first.”

Page 30: SQL-miljö

Embedded SQL med Java

DB2JDBC hanterar dynamisk SQLingen förkompilering, API calls

DB2SQLJ hanterar statisk SQLförkompilering med SQLJ TranslatorJDBC i botten för koppling till databasenoch felhantering

SQLJ Program SQLJRoutine Classes

JDBCInterface

DB2Database

Page 31: SQL-miljö

Öppna databasen jmf EXEC SQL CONNECT ’company’;

Connection con = null;String dbas = ”jdbc:db2:company”;DefaultContext ctx = DefaultContext.getDefaultContext();If (ctx == null) {

try{ con = DriverManager.getConnection(dbas); con.setAutoCommit(false); ctx = new DefaultContext(con);}catch (SQLException e) { System.out.println (e); System.exit (1);}DefaultContext.setDefaultContext (ctx);}

Page 32: SQL-miljö

Singleton select

Ex.

#sql {DELETE FROM project};

Ex.

string ename = null;#sql {SELECT ename INTO :ename FROM Employee WHERE enumber = ”4410”};System.out.println(”Namn = ” + ename);

Page 33: SQL-miljö

CursorEx. (= ex. i standard emb. SQL)

#sql iterator ptime (string pnumber, string pname, int hours);. . .ptime pt; (jmf EXEC SQL OPEN ptime;)string str1 = null;string str2 = null;int i3 = 0;#sql pt = {SELECT pnumber, pname, SUM(hours)

FROM project, Works WHERE Project.pnumber = Works.pnumber GROUP BY Project.pnumber, pname};

While (pt.next()) {str1 = pt.pnumber;str2 = pt.pname;i3 = pt.hours;System.out.println(str1 + str2 + i3);System.out.println();}

pt.close (); (jmf EXEC SQL CLOSE ptime;)

Page 34: SQL-miljö

Samma som föregående bild men med FETCH

Ex.. . .#sql iterator ptime (string pnumber, string pname, int hours);. . .ptime pt;string str1 = null;string str2 = null;int i3 = 0;#sql pt = {SELECT pnumber, pname, SUM(hours)

FROM project, Works WHERE Project.pnumber = Works.pnumber GROUP BY Project.pnumber, pname};

#sql {FETCH :pt INTO :str1, str2, i3}While (pt.endFetch()){

System.out.println(str1 + str2 + i3);#sql {FETCH :pt INTO :str1, :str2, :i3};}

. . .