char *strstmt; /* - kintamasis SELECT sakiniui */ / Išskiriame atmint kiekvieno stulpelio reikšmei. */

Similar documents
Interaktyviame režime: visi 5 etapai vykdomi nuosekliai; DBVS SQL sakinius interpretuoja. Programose: dalis etap gali bti atlikti kompiliuojant.

EMBEDDED SQL. Part 2: Dynamic Statements. University of Waterloo

Dynamic Embedded SQL

3) execute() Usage: when you cannot determine whether SQL is an update or query return true if row is returned, use getresultset() to get the

Database connectivity (II)

Trigeris, realizuojantis dalykin taisykl darbuotojas negali dalyvauti daugiau nei 3 projektuose : trigerio kamienas - vienas ar keli SQL sakiniai,

Databases 2012 Embedded SQL

SQL: Programming Midterm in class next Thursday (October 5)

Database Application Development

INTRODUCTION TO JDBC - Revised Spring

CSC System Development with Java. Database Connection. Department of Statistics and Computer Science. Budditha Hettige

You write standard JDBC API application and plug in the appropriate JDBC driver for the database the you want to use. Java applet, app or servlets

CSE 530A. DAOs and MVC. Washington University Fall 2012

INTRODUCTION TO JDBC - Revised spring

ERwin and JDBC. Mar. 6, 2007 Myoung Ho Kim

Databases and JDBC. by Vlad Costel Ungureanu for Learn Stuff

Outline. Lecture 10: Database Connectivity -JDBC. Java Persistence. Persistence via Database

SQL: Programming. Announcements (September 25) Motivation. CPS 116 Introduction to Database Systems. Pros and cons of SQL.

JDBC 3.0. Java Database Connectivity. 1 Java

JAVA pagrindai Lek. Liudas Drejeris

The Web Application Developer s. Red Hat Database. View. October 30, Webcast. Patrick Macdonald, Fernando Nasser. Red Hat Database Engineering

JDBC Architecture. JDBC API: This provides the application-to- JDBC Manager connection.

The Design of JDBC The Structured Query Language Basic JDBC Programming Concepts Query Execution Scrollable and Updatable Result Sets

JDBC Programming: Intro

Introduction to Databases

Logging and Recovery. 444 Section, April 23, 2009

DataBase Lab JAVA-DATABASE CONNECTION. Eng. Haneen El-masry

COP4540 TUTORIAL PROFESSOR: DR SHU-CHING CHEN TA: H S IN-YU HA

Java Database Connectivity

DB I. 1 Dr. Ahmed ElShafee, Java course

Instructor: Jinze Liu. Fall 2008

Discuss setting up JDBC connectivity. Demonstrate a JDBC program Discuss and demonstrate methods associated with JDBC connectivity

How to program applications. CS 2550 / Spring 2006 Principles of Database Systems. SQL is not enough. Roadmap

SQL in a Server Environment

Introduction to JDBC. JDBC: Java Database Connectivity. Why Access a Database with Java? Compilation. Six Steps. Packages to Import

SQL and Java. Database Systems Lecture 20 Natasha Alechina

Calling SQL from a host language (Java and Python) Kathleen Durant CS 3200

JDBC, Transactions. Niklas Fors JDBC 1 / 38

Parengė ITMM Artūras Šakalys 1

O ne of the most important features of JavaServer

PHP PROGRAMOS EIGOS VYKDYMO VALDYMAS

Kas yra masyvas? Skaičių masyvo A reikšmės: Elementų indeksai (numeriai): Užrašymas Turbo Paskaliu: A[1] A[2] A[3] A[4] A[5]

EMBEDDED SQL. SE 3DB3 Fall 2016 MICHAEL LIUT DEPARTMENT OF COMPUTING AND SOFTWARE MCMASTER UNIVERSITY

IBM i Version 7.2. Database Embedded SQL programming IBM

IBM -

Database Embedded SQL programming

JAVA AND DATABASES. Summer 2018

Session: E05 Faster FETCH, INSERT, UPDATE (MERGE) DB2 for z/os Multiple Row Processing

Database Application Development

Embedded SQL. csc343, Introduction to Databases Renée J. Miller and Fatemeh Nargesian and Sina Meraji Winter 2018

Embedded SQL. csc343, Introduction to Databases Diane Horton with examples from Ullman and Widom Fall 2014

Topic 12: Database Programming using JDBC. Database & DBMS SQL JDBC

BUSINESS INTELLIGENCE LABORATORY. Data Access: Relational Data Bases. Business Informatics Degree

13 Creation and Manipulation of Tables and Databases

Database Programming Overview. COSC 304 Introduction to Database Systems. Database Programming. JDBC Interfaces. JDBC Overview

SQL from Applications

Accessing databases in Java using JDBC

Java Database Connectivity

SQL Environment: Module Types. System Aspects of SQL. SQL Environment: Introduction. SQL Environment: Introduction. SQL Environment: Privileges

Enterprise Systems. Lecture 02: JDBC. Behzad BORDBAR

Java Database Connectivity

Cyrus Shahabi Computer Science Department University of Southern California C. Shahabi

Application Programming for Relational Databases

Embedded SQL. Introduction

Embedded SQL. Davood Rafiei

More Database Programming. CS157A Chris Pollett Nov. 2, 2005.

Overview. SQL from Applications. Accesing data from an application. Embedded SQL JDBC Stored Procedures. UVic C SC 370, Fall 2002

Pieter van den Hombergh. March 25, 2018

Introduction to JDBC. Lecture 12

Real SQL Programming 1

Database Programming. Week 9. *Some of the slides in this lecture are created by Prof. Ian Horrocks from University of Oxford

SQL DML and DB Applications, JDBC

Lecture 9&10 JDBC. Mechanism. Some Warnings. Notes. Style. Introductory Databases SSC Introduction to DataBases 1.

Visit for more.

Programming in Java

Lab # 9. Java to Database Connection

DB Programming. Database Systems

El. pašto konfigūravimas

Database Applications. SQL/PSM Embedded SQL JDBC

Java Database Connectivity (JDBC) 25.1 What is JDBC?

Lecture 2. Introduction to JDBC

Departamento de Lenguajes y Sistemas Informáticos

DATABASE DESIGN I - 1DL300

Java and the Java DataBase Connectivity (JDBC) API. Todd Kaufman April 25, 2002

Part I: Stored Procedures. Introduction to SQL Programming Techniques. CSC 375, Fall 2017

Database Design and Programming

Database Applications (15-415)

System Aspects of SQL

Chapter 13 Introduction to SQL Programming Techniques

Database-Connection Libraries

Designing a Persistence Framework

Database Application Programs PL/SQL, Java and the Web

Persistency Patterns. Repository and DAO

Copyright 2016 Ramez Elmasri and Shamkant B. Navathe

Contents. Introducing the course. Aim: to learn engineering of multi-tired web based systems. Road map of the course. Roadmap..

Chapter 4 Application Programs and Object-Relational Capabilities

Non-interactive SQL. EECS Introduction to Database Management Systems

JDBC - INTERVIEW QUESTIONS

Servlet 5.1 JDBC 5.2 JDBC

Unit 2 JDBC Programming

Transcription:

8.9. Dinamini užklaus vykdymas Sudarant program, kuri išvest vartotojo pasirinktos lentel s ir pasirinkt jos stulpeli reikšmes, negalime aprašyti bazini kintam j, nes nežinome: stulpeli skai iaus; stulpeli tip. => negalime parašyti FETCH sakinio. Tuomet sakiniuose PREPARE ir FETCH reikia naudoti SQL apibr žimo srit SQLDA (SQL Description Area) 1-33 2 SQLDA tai kintamo ilgio strukt ra, susidedanti iš keli dali : pastoviosios dalies, kuri yra strukt ros pradžioje, kintamosios dalies strukt r SQLVAR masyvo. struct sqlda char sqldaid[8]; /* Eye catcher = 'SQLDA ' */ long sqldabc; /* SQLDA size = 16+44*SQLN */ short sqln; /*Number of SQLVAR elements */ short sqld; /* # of columns or host vars. */ struct sqlvar sqlvar[1]; /* first SQLVAR element */ 3-33 Kiekvien SQL sakinio parametr (stulpel ) atitinka 1 SQLVAR strukt ra. Masyvo element skai ius yra simenamas pastovioje dalyje. Strukt roje SQLVAR yra laukai, atitinkantys: stulpelio duomen tip ir ilg, kintam j indikatori, nuoroda reikiamo ilgio duomen srit stulpelio reikšmei patalpinti. Strukt ra SQLVAR yra išsamus stulpelio aprašas (deskriptorius): struct sqlvar /* Variable Description */ short sqltype; /* Variable data type */ short sqllen; /* Variable data length */ char *sqldata; /* Pointer to variable data value*/ short *sqlind; /* Pointer to Null indicator */ struct sqlname sqlname; /* Variable name */ 4 SQL sakiniu DESCRIBE EXEC SQL DESCRIBE <SQL sakinio vardas> INTO :<sqlda tipo kintamasis> Galima sužinoti SQL sakinyje simboli eilut je esan i parametr (stulpeli ) skai i. Žinant stulpeli skai i, galima dinamiškai (malloc, new) išskirti atmint SQLVAR strukt r masyvui. Paruošus atminties srit stulpeli aprašams, sakiniu DESCRIBE galima dar kart kreiptis DBVS, kad užpildyt stulpeli apraš srit (stulpeli vardus,...) Žinant stulpeli aprašus, programavimo kalbos priemon mis galima išskirti atmint užklausos rezultato eilut s vis stulpeli reikšm ms. 5-33 EXEC SQL INCLUDE SQLDA;/ traukti apibr žimo srit / EXEC SQL BEGIN DECLARE SECTION; char sqlstmt[32000] ; /*Masymas SELECT ui */ EXEC SQL END DECLARE SECTION; struct sqlda sqlda ; / Kintamasis-apibr žimo sritis / /* masyve sqlstmt suformuojamas SELECT as */ EXEC SQL PREPARE stmt FROM :sqlstmt ; EXEC SQL DECLARE curs CURSOR FOR stmt ; memset( &sqlda, 0, sizeof(sqlda) ) ; / švalyti srit / / Prašome sistemos užpildyti stulpeli kiek : / EXEC SQL DESCRIBE stmt INTO :sqlda ; 6 / Išskiriame atmint stulpeli aprašams-sqlvar masyvui*/ /*Prašome detalios informacijos apie kiekvien stulpel : / EXEC SQL DESCRIBE stmt INTO :sqlda ; / Išskiriame atmint kiekvieno stulpelio reikšmei. */ /* Nuorodas reikšmi sritis talpiname SQLVAR laukuose*/ EXEC SQL OPEN curs; /*Atidaryti užklausos žymen */ EXEC SQL FETCH curs USING DESCRIPTOR :sqlda; Duomen apdorojimas, ir kt. eilu i skaitymas / 7-33 C funkcija su 1 parametru simboli eilute užklausa. void SelectUsingDescribe(char *selectstmt) EXEC SQL BEGIN DECLARE SECTION; char *strstmt; /* - kintamasis SELECT sakiniui */ EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR GOTO error; EXEC SQL WHENEVER NOT FOUND GOTO end; struct sqlda *psqlda = NULL; int nofcolumns ; strstmt = selectstmt ; EXEC SQL PREPARE stmt FROM :strstmt; /*Ruošiame atminti stulpeli skai iui*/ SqldaInit(&pSqlda, 1); 8

/* Sužinome stulpeli skai i : */ EXEC SQL DESCRIBE stmt INTO :*psqlda; nofcolumns = (int) psqlda->sqld; free(psqlda); /* Ruošiame atmint duomenims apie stulpelius: */ SqldaInit(&pSqlda, nofcolumns); /* Sužinome vis stulpeli aprašus */ EXEC SQL DESCRIBE stmt INTO :*psqlda; EXEC SQL DECLARE curs CURSOR FOR stmt; EXEC SQL OPEN curs; /* Ruošiame atmint vis stulpeli reikšm ms */ RowDataMemoryAlloc(pSqlda); 9-33 while( 0 == SQLCODE ) EXEC SQL FETCH curs USING DESCRIPTOR :*psqlda; RowDataDisplay(pSqlda); EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL WHENEVER NOT FOUND CONTINUE; error: printf( SQL klaida: %ld\n, SQLCODE) ; end: EXEC SQL CLOSE curs ; 10 void SqldaInit(struct sqlda **ppsqlda, int nofcolumns) int memsize = offsetof(struct sqlda, sqlvar) + nofcolumns*sizeof(struct sqlvar); *ppsqlda = (struct sqlda *) malloc(memsize); memset(*ppsqlda, '\0', memsize ) ; memcpy((*ppsqlda)->sqldaid, "SQLDA ", 8); (*ppsqlda)->sqldabc = memsize ; (*ppsqlda)->sqln = nofcolumns; (*ppsqlda)->sqld = 0; 11-33 void RowDataMemoryAlloc (struct sqlda *psqlda) unsigned int memsize; for(icol = 0; icol < psqlda->sqld; icol++) /* Išskiriame atmint indikatoriui */ psqlda->sqlvar[icol].sqlind = (short *) malloc(sizeof(short)); memset(psqlda->sqlvar[icol].sqlind, '\0', sizeof(short)); 12 /* Išskiriame atmint reikšmei */ switch (psqlda->sqlvar[icol].sqltype) case SQL_TYP_FLOAT: case SQL_TYP_SMALL: memsize=psqlda->sqlvar[icol].sqllen; case SQL_TYP_DATE: case SQL_TYP_TIME: case SQL_TYP_CHAR: case SQL_TYP_VARCHAR: memsize=psqlda->sqlvar[icol].sqllen+1; 13-33 14 /*Išskiriame atmint sud tingesni tip reikšm ms*/ case SQL_TYP_DECIMAL:... psqlda->sqlvar[icol].sqldata = (char *) malloc(memsize); memset(psqlda->sqlvar[icol].sqldata, '\0', memsize); void RowDataDisplay(struct sqlda *psqlda) for( icol = 0; icol < psqlda->sqld; icol++ ) CellDataDisplay(&pSqlda->sqlvar[iCol]) ; printf("\n"); /* - eilut s pabaiga */ 15-33 void CellDataDisplay( struct sqlvar *psqlvar ) printf("%s:", psqlvar->sqlname.data); /*vardas*/ if(psqlvar->sqlind < 0) printf("-"); /* - NULL reikšm */ else switch (psqlvar->sqltype) case SQL_TYP_DATE: case SQL_TYP_TIME: case SQL_TYP_CHAR: case SQL_TYP_VARCHAR: printf("%s", psqlvar->sqldata); 16

case SQL_TYP_SMALL: printf("%d",*((short *)psqlvar->sqldata)); case SQL_TYP_FLOAT: printf("%f",*((double *)psqlvar->sqldata)); /* Kit tip reikšmi išvedimas */... 17-33 18 void RowDataMemoryFree(struct sqlda *psqlda) for( icol = 0; 0!= psqlda && icol< psqlda->sqld; icol++ ) if( 0!= psqlda->sqlvar[icol].sqldata) free(psqlda->sqlvar[icol].sqldata); if( 0!= psqlda->sqlvar[icol].sqlind) free(psqlda->sqlvar[icol].sqlind); if( 0!= psqlda ) free(psqlda); 8.10 S saja JDBC Taikom j program s saja pateikia programuotojams funkcijas-paprogrames SQL sakiniams atlikti. JDBC (Java Database Connectivity) taikoma JAVA programavimo kalbos programose. import java.sql.*; Programos nereikia prekompiliuoti. Visi SQL sakiniai, kuriais kreipiamasi DBVS paruošiami programos vykdymo metu - dinamiškai => program s saja mažiau efektyvi už statinius program SQL sakinius. Bet.. patogi. Program s saja ypa gerai tinka dinamiškiems SQL sakiniams vykdyti. 19-33 8.10.1. Ryšys su DB Ryšys tarp programos ir duomen baz s nustatomas 2 etapais: keliama konkre iai DBVS b dinga tvarkykl, užtikrinti tolimesni JDBC paslaug nepriklausomum nuo DBVS ypatum. PostgreSQL tvarkykl galima aktyvuoti taip Class.forName("org.postgresql.Driver"); IBM DB2: Class.forName("COM.ibm.db2.jdbc.app.DB2Driver"). newinstance(); 20 21-33 Ryšys su konkre ia DB nustatomas sukuriant klas s Connection objekt, pvz., Connection con = DriverManager.getConnection( "jdbc:postgresql://pgsql.mif/darbai", username, password ) ; getconnection parametrai: DB URL (Unified Resource Location), kur sudaro: protokolas (jdbc), DBVS (postgresql, db2,..) ir nuoroda DB (//pgsql.mif/darbai). username - sistemos vartotojo vardas password - sistemos vartotojo slaptažodis. 8.10.2. Paprast SQL vykdymas SQL sakini vykdymui JDBC yra numatyta objekt klas Statement. Sukuriant šios klas s objekt, ryšys su konkre ia DB jau turi b ti nustatytas. Turint Connection klas s objekt con, klas s Statement objekt galima sukurti taip Statement stmt = con.createstatement() ; Konkret klas s Statement objekt galima naudoti daugeliui SQL sakini vykdyti. 22 Papraš iausiai vykdomi DDL ir duomen atnaujinimo sakiniai (INSERT, DELETE, UPDATE): klas s Statement objektui kvie iamas metodas executeupdate Statement stmt = con.createstatement(); stmt.executeupdate( "INSERT INTO Vykdytojai " + "VALUES (6, Baltakis, Informatikas, 2, NULL)" ) ; String str = "UPDATE Vykdytojai " + "SET Kategorija = Kategorija + 1"; stmt.executeupdate(str); 23-33 24 Kad t pat SQL sakin b t galima efektyviai atlikti kelet kart iš pradži jis paruošiamas, vykdamas daug kart su reikiamomis parametr reikšm mis: PreparedStatement stmt = con.preparestatement("update Vykdytojai" + "SET Kategorija =? WHERE Pavarde =?" ) ; stmt.setint(1, 5); stmt.setstring(2, "Jonaitis"); stmt.executeupdate(); // - Jonai iui nauja kategorija

stmt.setint(1, 4); stmt.setstring(2, "Petraitis"); stmt.executeupdate(); // - Petrai iui nauja kategorija Metodais setint ir setstring yra priskiriamos reikšm s parametrams. 25-33 8.10.3. Transakcijos Transakcijos yra valdomos Connection objekto metodais. JDBC numatyta, kad po kiekvieno SQL sakinio automatiškai užbaigiama transakcija. Kad užtikrinti keli SQL sakini transakcijas, reikia atšaukti numatyt j transakcij valdym. Automatinis transakcij valdymas išjungiamas ir jungiamas metodu setautocommit, kur kvie iant reikia nurodyti vien parametr - Boolean tipo reikšm. COMMIT sakin atitinka commit metodas ROLLBACK rollback. 26 8.10.4. Klaid apdorojimas Klaidoms, atsirandan ias programos vykdymo metu, perteikti yra specialios klas s: SQLException ir SQLWarning. Klaidos apdorojamos objektinei kalbai prastu b du gaudant klaid vykius: try // atšaukiame automatini pakeitim tvirtinim : con.setautocommit(false); stmt.executeupdate(<sql sakinys 1>); stmt.executeupdate(<sql sakinys n>); con.commit() ; con.setautocommit(true) ; 27-33 catch(sqlexception ex) System.err.println("SQLException: " + ex.getmessage()) ; con.rollback() ; con.setautocommit(true) ; 28 8.10.5. Užklaus apdorojimas Užklausos vykdomos kvie iant klas s Statement objektui metod executequery. Metodas rezultate gr žina klas s ResultSet objekt. Klas užtikrina rezultato eilu i perži r metodu next. Kvie iant next, vidinis objekto žymuo kiekvien kart paslenkamas vis prie kitos eilut s. Metodais, atitinkan iais rezultato stulpeli tipus, gaunamos eilut s reikšmes. 29-33 Vis darbuotoj vardai ir j kategorijos: String name; int category; ResultSet rs = stmt.executequery( "SELECT Pavard, Kategorija FROM Vykdytojai" ); while( rs.next() ) name = rs.getstring("pavard "); category = rs.getint("kategorija"); System.out.println(name + " kategorija: " + (rs.wasnull()? "-" : category) ); 30 Metoduose getstring ir getint naudojamus stulpeli vardus (Pavard ir Kategorija) galima pakeisti stulpeli eil s numeriais: name = rs.getstring(1); category = rs.getint(2); Metodu wasnull galima sužinoti, ar stulpelio reikšm, kuri buvo kreiptasi prieš pat kvie iant š metod, buvo NULL. 31-33 32 Patogiam užklausos rezultato perrinkimui yra numatyta pakankamai daug metod. J vardai atspindi prasm : getrow isfirst isbeforefirst islast isafterlast absolute previous relative ir kt.

Pvz., rs.absolute(3); // šokti prie tre ios eilut s rs.previous(); // sugr žti vien eilut atgal rs.relative(2); // dvi eilutes pirmyn (prie 4-os) rs.relative(-3); // atgal per tris eilutes (prie 1-os) 33-33