1. Nelielas Java klases programmas definēšana, kompilēšana ...



Contents TOC \o "1-3" \h \z \u 1. Nelielas Java klases programmas definē?ana, kompilē?ana un izvade PAGEREF _Toc404339167 \h 32. Java klases programma ielāde datubāzē ar loadjava programmu un definē?ana ar CREATE JAVA. PAGEREF _Toc404339168 \h 53. JDBC pamatfunkcijas un darbības sākums PAGEREF _Toc404339169 \h 134. Java klases meto?u pielieto?ana SQL komandu izpildei (datu ievade) PAGEREF _Toc404339170 \h 185. Java klases meto?u pielieto?ana SQL komandu izpildei (datu izvade) PAGEREF _Toc404339171 \h 236. Metodes definē?ana ar JAVA klasi un tās pielieto?ana PAGEREF _Toc404339172 \h 267. Secinājumi PAGEREF _Toc404339173 \h 288. Lietotā literatūra PAGEREF _Toc404339174 \h 301. Nelielas Java klases programmas definē?ana, kompilē?ana un izvadeDarbs tiek pildīts ar Ortus.rtu.lv piedāvāto Oracle SQL Developer un Java Developer Kit 1.8.0_05. Tā kā pirmais uzdevums ir vienkār?i parādīt pa?us Java valodas lieto?anas pamatus, no sākuma izveido?u nelielu klasi, kas radīs programmas objektu tipam manā datubāzē analo?iskus objektus un tos ievietos masīvā, no kurienes notiks datu izvade. Programmu pirmkoda rakstī?anu jeb definē?anu veicu Notepad ++ vidē. Tātad ?ī klase praktiski veidos mazu rindas objektu tabulu java vidē.Objekta tips manā datubāzē:create or replacetype PROGRAM as object (Ident_numurs number(3,0),Nosaukums varchar2(30),Klasifikacija varchar2(30));PIRM_UZD.java faila saturs (definē?ana)// No sakuma define objektu klasi (lidzigi ka objektu tipu datubaze)class Programma {private int Ident_numurs;private String Nosaukums;private String Klasifikacija;//Definesim konstruktoru lidzigi ka konstruktora metodes definesana datubazes objektu tipampublic Programma(int i, String a, String b) {Ident_numurs=i; Nosaukums = a; Klasifikacija = b;}//Aprakstisu izvades metodes dotajai objektu klasei (individualu atributu ievadi soreiz nevajadzes) public int getID() {return Ident_numurs;}public String getNos() {return Nosaukums;}public String getKlas() {return Klasifikacija;} }public class PIRM_UZD{public static void main(String[] args){//Tagad veiksu pasa programmu masiva izveidiProgramma Programmas[]= new Programma[3];Programmas[0]= new Programma(1,"Zumba","Datorspele");Programmas[1]= new Programma(2,"Klints","Draiveris");Programmas[2]= new Programma(3,"Plits","Registra tiritajs");//Veiksu izvadifor (Programma p : Programmas) System.out.println(p.getID()+". programmas nosaukums ir " + p.getNos() + "un tas/ta ir" + p.getKlas());}}Tālāk ar komandu iek? Windows command line ievadīju komandu javac PIRM_UZD.java. Javac.exe kompilē izveidoto java failu. Pēc tam ar java PIRM_UZD komandu veicu kompilētās programmas palai?anu. Svarīgi pieminēt to, ka jdk jeb java development kit nepalai? java failus, to dara ieinstalētais java lietojums. Jdk uzdevums ir izpildīt kompilāciju un dot palīglīdzek?us java programmu izveidei. Vēl varu piebilst, ka vismaz manam ieinstalētajam java lietojumam ir problēmas ar garo burtu lieto?anu līdzska?iem.Iegūtais izraksts: 2. Java klases programma ielāde datubāzē ar loadjava programmu un definē?ana ar CREATE JAVA.Loadjava komandu arī ir jāizpilda komandlīnijā, bet, pirms to var darīt, jāinstalē oracle klients, kurā bin mapē atroda loadjava.bat programma. ?im nolūkam izmantoju oracle 11g R2 klientu. Ielādē?u jau iepriek? izveidoto PIRM_UZD.java pirmkodu, bet to nedaudz pārveido?u.Komandlīnijā ievadītā komanda:loadjava –u DB_121RDB505/DB_121RDB505@85.254.218.228:1521:DITF11 –v –r- t PIRM_UZD.java, kur loadjava norāda uz komandu, u norāda ir lietotāja parametrs DB_121RDB505 ir gan lietotāja vārds, gan parole (kā izsniegts visiem RTU studentiem ?ajā kursā), 85.254.218.228 ir servera ip adrese, 1521 ir ports un DITF11 ir SID. PIRM_UZD.java ir ielādētais java fails. Iegūtais izraksts:Datubāzē tālāk aplūko?u nesen izveidoto objektu metadatus.select OBJECT_NAME, OBJECT_TYPE, STATUS, CREATED, GENERATEDfrom USER_OBJECTSwhere CREATED >= TO_DATE('13-11-2014', 'DD-MM-YYYY');Izvadītie dati:Kā redzams, kopumā tika radīti septi?i objekti datubāzē pēc ?īs vienas java programmas pirmkoda ievades. Tas ir tādē?, ka iek? loadjava komandas es arī liku java programmu kompilēt. Pats pirmkods atrodas PIRM_UZD Java source tipa objektā. JAVA CLASS objekti apraksta at??irīgās objektu klases, kas tika definētas programmā. LOB tabula apraksta vai tiek veidoti tā saucamie ?lielie objekti”. Java options satur opcijas. LOB un INDEX tipa objektus, kā redzams, datubāze patstāvīgi ?enerē JAVA programmas objektu indeksē?anai un aprakstī?anai. Izdzēsu ar programmu PIRM_UZD datubāzē eso?os objektus un ievadīju jaunu java programmas pirmkodu PIRM_UZD2. Pirmajā uzdevumā nebija paredzētā izvade ar return funkciju, tādē? vajadzēja java pirmkodu nedaudz pārveidot.PIRM_UZD2 pirmkods:// No sakuma define objektu klasi (lidzigi ka objektu tipu datubaze)class Programma2 {private int Ident_numurs1;private String Nosaukums1;private String Klas;//Definesim konstruktoru lidzigi ka konstruktora metodes definesana datubazes objektu tipampublic Programma2(int i, String a, String b) {Ident_numurs1 = i; Nosaukums1 = a; Klas = b;}//Aprakstisu izvades metodes dotajai objektu klasei (individualu atributu ievadi soreiz nevajadzes) public int getID1() {return Ident_numurs1;}public String getNos1() {return Nosaukums1;}public String getKlas1() {return Klas;} }public class PIRM_UZD2{public static String Izvade1() {String Izvads1 = " ";//Tagad veiksu pasa programmu masiva izveidiProgramma2 Programmas1[]= new Programma2[3];Programmas1[0]= new Programma2(1,"Zumba","Datorspele");Programmas1[1]= new Programma2(2,"Klints","Draiveris");Programmas1[2]= new Programma2(3,"Plits","Registra tiritajs");//Veiksu izvadifor (Programma2 p : Programmas1) Izvads1=(Izvads1 + p.getID1()+". " + p.getNos1() + " " + p.getKlas1());return Izvads1;}public static void main(String[] args){String Izv1 = Izvade1();System.out.println(Izv1);}}Atkal izmantoju loadjava komandu, lai datubāzē ielādētu ?o java programmu. Pēc tam definēju funkciju, kas izmanto ielādētajā programmā eso?o funkciju Izvade, kas vienā simbolu virknē izvada visu trīs izveidotos objektu datus.create or replace function Izvade return varchar2 as language java name 'PIRM_UZD2.Izvade() return java.lang.String';Tālāk izmantoju sql plus programmu, lai izgūtu datus. Darbību izvads:Sqlplus komandā norādīts ir lietotāja nosaukums/parole@IP datubāzei/SIDSet serveroutput ON; at?auj izgūt datus no datubāzes.Call DBMS_JAVA.SET_OUTPUT(2000); dod iespēju strādāt ar java programmām.Variable vari varchar2(200); norāda uz mainīgo tā lietotāja datora atmi?ā, kur? rada savienojumu. ?ajā mainīgajā ar komandu call Izvade() into :vari; ievietoju simbolu rindu, kura rodas java programmas izpildes rezultātā. Print vari; izvada mainīgā saturu uz ekrāna.Izveidoto objektu metadati:select OBJECT_NAME, OBJECT_TYPE, STATUS, CREATED, GENERATEDfrom USER_OBJECTSwhere CREATED >= TO_DATE('13-11-2014', 'DD-MM-YYYY');Tālāk izmanto?u komandu create java, lai varētu definēt java programmas pirmkodu iek? sql*plus un to uzreiz ielādēt datubāzē. Izmanto?u to pa?u programmu, bet nedaudz mainī?u izvadītos datus.CREATE JAVA vaicājums:CREATE or replace JAVA source named "OTR_UZD" ASpublic class OTR_UZD{public static String Izvade1() {String Izvads1 = " ";Programma3 Programmas1[]= new Programma3[3];Programmas1[0]= new Programma3(4,"Kamnits","Datorspele");Programmas1[1]= new Programma3(5,"GAZE","Draiveris");Programmas1[2]= new Programma3(6,"BUMSs","Registra tiritajs");for (Programma3 p : Programmas1) Izvads1=(Izvads1 + p.getID1()+". " + p.getNos1() + " " + p.getKlas1());return Izvads1;}public static void main(String[] args){String Izv1 = Izvade1();System.out.println(Izv1);}}class Programma3 {private int Ident_numurs1;private String Nosaukums1;private String Klas;public Programma3(int i, String a, String b) {Ident_numurs1 = i; Nosaukums1 = a; Klas = b;}public int getID1() {return Ident_numurs1;}public String getNos1() {return Nosaukums1;}public String getKlas1() {return Klas;} }/Sql plus izraksts:Izveido?u attiecīgi uz ?īs programmas izvades balstītu funkciju, tāpat kā iepriek?ējai programmai.create or replace function Izvade2 return varchar2 as language java name 'OTR_UZD.Izvade() return java.lang.String';Ar sql plus programmu veicu ?īs funkcijas izsauk?anu:Pirmā k?ūda ir tādē?, ka nedaudz k?ūdījos funkcijas definīcijā un otrajā k?ūdā nepieliku varchar2 simbolu skaitu. Tas ir ?oti svarīgi definējot sql plus mainīgos. Izvadī?u visus izveidoto objektu metadatus:select OBJECT_NAME, OBJECT_TYPE, STATUS, CREATED, GENERATED, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, SECONDARY, TEMPORARYfrom USER_OBJECTSwhere CREATED >= TO_DATE('13-11-2014', 'DD-MM-YYYY');Lielu da?u ?o objektus apraksto?o metadatu atribūtus es paskaidroju jau pirmajā darbā. Object_name ir objekta nosaukums, OBJECT_TYPE ir tā tips, STATUS norāda uz to, vai norādītais objekts ir kompilēts, kas ir īpa?i svarīgi izmantojot iek? datubāzes vai SQL PLUS komandu CREATE JAVE, kuras rezultātā tiek tie?i ielādēts objekts, bet kompilācija netiek veikta. Ja ielādētajā java klases programmā ir k?ūda, to uzzinās, kad tiks pielietota ?ī programma kādā funkcijā un, ja tajā būs kāda k?ūda, būs jāpārveido programma, tā atkal jāielādē utt. Līdz ar to, manuprāt, gudrāk ir izmantot javac kompilē?anas komandu līdz java programma ir gatava darbam un to ielādēt ar oracle programmu loadjava. Tad vismaz ir dro?s tas, ka programma strādā (protams, vēl joprojām var būt lo?ikas k?ūdas).GENERATED norāda to, vai datubāze pati automātiski ir ?enerējusi ?os objektus.SUBOBJECT_NAME norāda uz apak?objekta nosaukumu (ja tāds ir).OBJECT_ID ir ?im objektam unikāls piedēvēts objekta identifikators datubāzē.DATA_OBJECT_ID ir ?ajā objektā ievadīto datu identifikators. Kā redzams, pa?iem java objektiem nav piedefinēti dati, tie rodas ?o kla?u programmām izpildoties.SECONDARY apraksta, vai fails ir veidots ar ODCIINDEXCREATE metodi. Manā gadījumā tāda nav.TEMPORARY norāda, vai objekts netiks izdzēsts sesijas (savienojuma) beigās. Arī tādu manā darbā nav.Vēl viens metadatu atribūts, kuru man ne?āva izvadīt kopā ar pārējiem (nezinu kāpēc) ir OWNER, kas apraksta, kam ?ie objekti pieder. Protams, ?ie objekti pieder manam lietotājam.3. JDBC pamatfunkcijas un darbības sākumsJDBC dzinis ?auj java valodas programmām veikt savienojumu ar kādu datu bāzi un izmantot to kā datu avotu. Programma var arī veikt izmai?as datubāzē, piemēram, radot jaunas tabulas vai ievietojot datus. Pamata ideja JDBC darbībai ir Savienojuma elementa definē?ana norādot, kādu draiveri, lietotāja vārdu, paroli un kādam serverim pievienoties (precīzāks URL vērtību apraksts būs vēlāk). Tālāk definē vaicājumu komandas objektā, kas izpildīs nepiecie?amo darbību caur ?o savienojuma elementu. Jārē?inās ar to, ka vienā komandas objektā būs viens vaicājums. Ja tiek veikta datu izvade, jādefinē arī rezultātu objekts, kas saturēs vaicājuma rezultātu rindas. Tālāk tās var cikliski izvadīt (visi ?ie elementi tiks pielietoti tālākos uzdevumos). Lai parādītu JDBC pamatus, izpildī?u vienkār?u JDBC versijas izgū?anu no servera. Varu piebilst, ka nācās pāriet uz eclipse lietojumu java programmu veido?anai, jo JDBC nestrādāja ar vienkār?u javac / java komandu pielieto?anu komandlīnijā, bet par daudzajām problēmām veicot ?o darbu tālāk rakstī?u secinājumos. Java pirmkods:import java.sql.*;import oracle.jdbc.*; import oracle.jdbc.pool.OracleDataSource;public class savien{public static void main (String args[]) throws SQLException{OracleDataSource datuAv = new OracleDataSource();// Datu avots DatuAv norada uz to datubazi, ar kur Java programma stradas.datuAv.setURL("jdbc:oracle:thin:DB_121RDB505/DB_121RDB505@85.254.218.228:1521:DITF11");// Savienosanas notiek lidzigi ka ieprieks aprakstitaja loadjava komanda, bet janorada jdbc darbiba.Connection savien= datuAv.getConnection();// getConnection funkcija veic savienojuma izveidi ar datu avotu, kas laus talaku darbibu izpildi.DatabaseMetaData met = savien.getMetaData();// Izgust metadatus par datubaziSystem.out.println("JDBC versija: " + met.getDriverVersion());}}Izgūtais rezultāts:Kā redzams kodā, OracleDataSource() funkcijas rezultāts ir objekts, kuru izmanto kā sasaisti starp datu avotu (datubāzi) un java programmu. setURL funkcija norāda, ar ko savienojums ir jāveic. Parametri tiek definēti līdzīgi kā savienojoties ar datubāzi izmantojot loadjava komandu komandlīnijā , bet ir jānorāda to, ka tiek izmantots jdbc dzinis.jdbc:oracle:thin:DB_121RDB505/DB_121RDB505@85.254.218.228:1521:DITF11jdbc:oracle:thin: norāda uz jdbc dzini.DB_121RDB505/DB_121RDB505 norāda lietotāja nosaukumu un paroli.85.254.218.228:1521:DITF11 norāda ip adresi, kur atrodas datubāze, porta numuru un SID jeb darba vides identifikatoru.getConnection veic savienojuma radī?anu ar datubāzi izmantojot setURL norādītās vērtības.Kad savienojums definēts, var veikt darbības ar datu avotu izmantojot ?o savienojumu. ?ajā gadījumā es izguvu jdbc dzi?a versiju, kuru izmanto datubāze.Ar getMetaData funkciju izguvu metadatus no datubāzes un ar getDriverVersion izguvu no meta datu objekta tie?i dzi?a versiju. Tālāk izpildī?u vienkār?u vaicājumu, lai parādītu vaicājumu izpildi ar JDBC interfeisa palīdzību.Java pirmteksts:import java.sql.*;import oracle.jdbc.*; import oracle.jdbc.pool.OracleDataSource;public class savien2{public static void main (String args[]) throws SQLException{OracleDataSource datuAv = new OracleDataSource();// Datu avots DatuAv norada uz to datubazi, ar kur Java programma stradas.datuAv.setURL("jdbc:oracle:thin:DB_121RDB505/DB_121RDB505@85.254.218.228:1521:DITF11");// Savienosanas notiek lidzigi ka ieprieks aprakstitaja loadjava komanda, bet janorada jdbc darbiba.Connection savien= datuAv.getConnection();// getConnection funkcija veic savienojuma izveidi ar datu avotu, kas laus talaku darbibu izpildi.Statement TAB_IZV = savien.createStatement();// Izveidoju vaicajuma mainigoTAB_IZV.executeUpdate("CREATE TABLE PROGRAMMOV " + "(Ident_numurs number(3,0), " + " Nosaukums varchar2(30), " + " Klasifikacija varchar2(30))"); // Veidojam vaicajumu, kura merkis ir radit programma objektam analogisku tabuluSystem.out.println("Tabulas izveide pabeigta");}}Iegūtais izraksts pēc pirmkoda palai?anas:Apskatī?u datubāzi, lai varētu redzēt vai tabula tie?ām izveidota:Kā redzams, datubāzē tabula PROGRAMMOV tik tie?ām ir izveidota. Tālāk veiksim datu ievadi ?ajā tabulā. TAB_IZV mainīgo definēju kā vaicājuma sql kodu datubāzei un tajā ievietoju tabulas izveides kodu.Java pirmkods:import java.sql.*;import oracle.jdbc.*; import oracle.jdbc.pool.OracleDataSource;public class savien3{public static void main (String args[]) throws SQLException{OracleDataSource datuAv = new OracleDataSource();// Datu avots DatuAv norada uz to datubazi, ar kur Java programma stradas.datuAv.setURL("jdbc:oracle:thin:DB_121RDB505/DB_121RDB505@85.254.218.228:1521:DITF11");// Savienosanas notiek lidzigi ka ieprieks aprakstitaja loadjava komanda, bet janorada jdbc darbiba.Connection savien= datuAv.getConnection();// getConnection funkcija veic savienojuma izveidi ar datu avotu, kas laus talaku darbibu izpildi.Statement TAB_IZV = savien.createStatement();// Izveidoju vaicajuma mainigoTAB_IZV.executeUpdate("INSERT INTO PROGRAMMOV values " + "(1,'Kamits','Dzinis')");TAB_IZV.close();Statement TAB_IZV1 = savien.createStatement();//Izveidoju vaicajuma mainigoTAB_IZV1.executeUpdate("INSERT INTO PROGRAMMOV values " + "(2,'Zvers','Operetajsistema')");TAB_IZV1.close();Statement TAB_IZV2 = savien.createStatement();//Izveidoju vaicajuma mainigoTAB_IZV2.executeUpdate("INSERT INTO PROGRAMMOV values " + "(3,'Ej zakos','Datorspele')");TAB_IZV2.close();System.out.println("Datu ievade pabeigta");}}Izraksts:Apskatī?u datubāzes tabulas saturu:SELECT * from programmov;Darbības princips tāds pats kā izveidojot tabulu, bet tabulas izveides vaicājuma vietā jāieraksta datu ievades vaicājums. Veidoju trīs vaicājumus, jo vēlējos ievietot trīs rindas.Tagad apskatī?u, ko darīt, lai veiktu ?o izvadi nevis datubāzē pa?ā, bet ar java programmu.Java pirmkods:import java.sql.*;import oracle.jdbc.*; import oracle.jdbc.pool.OracleDataSource;public class savien4{public static void main (String args[]) throws SQLException{OracleDataSource datuAv = new OracleDataSource();// Datu avots DatuAv norada uz to datubazi, ar kur Java programma stradas.datuAv.setURL("jdbc:oracle:thin:DB_121RDB505/DB_121RDB505@85.254.218.228:1521:DITF11");// Savienosanas notiek lidzigi ka ieprieks aprakstitaja loadjava komanda, bet janorada jdbc darbiba.Connection savien= datuAv.getConnection();// getConnection funkcija veic savienojuma izveidi ar datu avotu, kas laus talaku darbibu izpildi.Statement TAB_IZVADE = savien.createStatement();// Izveidoju vaicajuma mainigoResultSet Ieraksti = TAB_IZVADE.executeQuery("SELECT Ident_numurs, Nosaukums, Klasifikacija from PROGRAMMOV");while(Ieraksti.next()){int id = Ieraksti.getInt("Ident_numurs");String Nos = Ieraksti.getString("Nosaukums");String Klas = Ieraksti.getString("Klasifikacija");System.out.print("Ident_numurs: " + id);System.out.print("Nosaukums: " + Nos);System.out.print("Klasifikacija: " + Klas);System.out.println("");}TAB_IZVADE.close();System.out.println("Datu ievade pabeigta");}}Ar executeQuery funkciju tiek datubāzē izpildīts vaicājums. Kā apskatīts pagāju?ajā darbā, pēc vaicājuma izpildes rezultāti tiek ievadīti operatīvās atmi?as rezervētā apgabalā. ?o apgabalu iek? RecordSet mainīgā izgūst no datubāzes un ielasa tā datora atmi?ā, uz kura tiek palaista java programma. Tālāk no ?īs atmi?as izgūst atribūtu vērtības ( ar funkcijām getInt un getString ?ajā gadījumā). while(Ieraksti.next()) mēr?is ir atkārtot ?o ierakstu izvadi līdz visas rindas ir izvadītas.Tātad esam redzēju?i kā izgūt draivera informāciju (kā arī citus datubāzes metadatus), kā izveidot tabulas un, ja nepiecie?ams tāpat var arī izveidot objektu tipus, kā veikt datu ievadi ar SELECT komandu no relāciju DB un kā veikt datu izvadi ar SELECT komandu no relāciju DB, pielietojot JDBC interfeisu. 4. Java klases meto?u pielieto?ana SQL komandu izpildei (datu ievade)Pamatā SQL vaicājumu izpildi ar JDBC interfeisu jau apskatīju iepriek?ējā uzdevumā, kad no PROGRAMMOV izguvu datus, kā arī ievietoju datus un izveidoju tabulu. Tādē? ?ajā noda?ā specifiski aprakstī?u Java klases meto?u pielietojumu procedūrās, jo tas, manuprāt, ir viena no noderīgākajiem JDBC interfeisa pielietojumiem, jo tas ?auj vienkār?ot vaicājumu definē?anu, kas vaicājumiem, kurus datubāzē daudz jāatkārto, ir ?oti noderīgi.Iepriek?ējā praktiskajā darbā izveidoju ?oti daudz līdzīgas tabulas KOMANDA, lai demonstrētu da?ādu meto?u darbību. Visās ?ajās tabulās bija ievietotas pabeigto programmu un nepabeigto programmu objektu kolekcijas. No pieredzes atceros to, ka man nepatika izveidot jaunus objektus programmu kolekcijās pēc visas komanda tabulas rindas definē?anas. Izveido?u funkciju, kas padara ?ādu darbību daudz vienkār?āku, kā arī, protams, ?auj pievienot ?os objektus ārpus datubāzes (piemēram, ar lietojumu sqlplus).No sākuma izveidosim JAVA pirmtekstu: import java.sql.*; import oracle.jdbc.*;public class kol_iev {public static void main (String[] args) throws SQLException {Connection savienz = DriverManager.getConnection("jdbc:default:connection:");String sql = "INSERT INTO TABLE(select A." + args[1] + " FROM " + args[0] + " A where " + args[2] + ") values (" + args[3] + ")"; try { Statement vaic = savienz.createStatement(); vaic.executeUpdate(sql); System.out.println(sql); vaic.close();} catch (SQLException e) { System.err.println(e.getMessage()); } }}Ar loadjava programmu aug?upielādēju ?o klasi datubāzē.Tālāk jāizveido pakete un jādefinē procedūru, kuru izpildot notiks arī JAVA klases izpilde. Vajadzēs ievadīt tabulas nosaukumu, kolekcijas nosaukumu, nosacījumu, pēc kura tabulā atlasa pareizo kolekciju un pa?u objektu, kuru ievietos kolekcijā.CREATE OR REPLACE PACKAGE kol ASPROCEDURE iev (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac VARCHAR2, objekts VARCHAR2);END;Tālāk definēju procedūras darbību, kurā lieku izmantot java klasi.CREATE OR REPLACE PACKAGE BODY kol ASPROCEDURE iev (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac VARCHAR2, objekts VARCHAR2) AS LANGUAGE JAVANAME 'kol_iev.main(java.lang.String[])';END;Viena problēma, ko jau novēroju, ir tā, ka cmd ne?auj rakstīt burtus ar garumzīmēm, tādē? komandas nosaukumu D?oniji pārdēvēju uz Dzoniji. Tālāk izpildīju call komandu SQL Developer vidē, lai pārbaudītu tās darbību.call KOL.IEV('KOMANDA','NEPABEIGTAS_PROGR','KOM_NOSAUKUMS=''Dzoniji''','PROGRAM(''12'',''Divpatsmitais'',''Virus'')')Iegūtais rezultāts:select * from komanda;Kā redzams, tre?ās rindas (kas atbilst komandai Dzoniji) pēdējais objekts ir programma Divpatsmitais. Tālāk ievieto?u objektu caur sqlplus vidi.Izpildot ?o komandu sqlplus vidē, programma ?uzkaras” un netiek izpildītas nekādas tālākas darbības (nav iespējama nekāda tālāka ievade komandlīnijā). Izraksts:Tā kā java klase un procedūra ir pēc struktūras līdzīga, kā arī procedūra izpildījās sql developer vidē, nezinu, kāda ir problēma. Sqlplus procesa patērētie resursi arī nenorāda uz nekādu darbību.Kā redzams, procesora resursi netiek lietoti.Problēma atrisinājās, kad aizvēru SQL Developer. Pie?emu, ka, tā kā savienojums radās no vienas un tā pa?as IP adreses, tika blo?ēts ?is funkcijas izsaukums no SQL un uzskatīts par kaut kādu SQL developer savienojuma da?u nevis par patstāvīgu izsaukumu.Izraksts: Problēma ir tāda, ka, lai gan java fails izpildās (jo notiek sql mainīgā izvade), pati darbība datubāzē nenotiek. Mē?ināju da?ādos viedos izpildīt procedūru, bet visi bija neveiksmīgi. Rezultātā neizdevās pievienot objektu Dzoniji pabeigto vai nepabeigto programmu kolekcijai (mē?ināju darbību izpildīt ar abām). Vai vismaz tā likās…Tālāk par to runā?u secinājumos, bet, veicot izvadu caur pa?u sqlplus ieguvu ?ādu rezultātu :Tātad D?oniji komandai tika re?istrēti visi izsaukumi, jo, kā redzams, ir ?oti daudz Divpatsmitais programmu ?ajās kolekcijās. Turpretī, pieprasot funkcijas izpildī?anu sql developer radās k?ūda.Pēc izie?anas no SQL plus iegūtais rezultāts:Tā kā grūti saredzēt izvadu norādī?u divus ierakstus:Dzoniji komanda ir izgatavojusi ?oti daudz Divpatsmitais vīrusu. Tie ir tikai divi objekti no daudziem. Problēma bija tā, kā datubāze sa?em savienojumu, bet par to runā?u tālāk secinājumos.5. Java klases meto?u pielieto?ana SQL komandu izpildei (datu izvade)Līdzīgi kā iepriek?ējā uzdevumā, strādā?u ar tabulā eso?ām kolekcijām. ?oreiz veido?u procedūru ar Java klases metodes pielieto?anu, bet, at??irībā no pagāju?ās reizes, izmanto?u meto?u pārlādi. Varēs izgūt ne tikai vienu kolekciju, bet arī divas. Arī izmanto?u PreparedStatement objektu vaicājuma definē?anai. Pirmkārt, pirmteksts:import java.sql.*;import oracle.jdbc.*;import oracle.jdbc.pool.OracleDataSource;public class kol_izv {public static void main (String[] args) throws SQLException {Integer n =0;Connection savienz = DriverManager.getConnection("jdbc:default:connection:");String sql = "Select value(B).Nosaukums FROM TABLE(select A."+ args[1] +" FROM " + args[0] + " A where " + args[2]+"=?) B"; try { PreparedStatement pstmt = savienz.prepareStatement(sql); pstmt.setString(1,args[3]); ResultSet Ieraksti = pstmt.executeQuery(); while(Ieraksti.next()){String obj = Ieraksti.getString("value(b).Nosaukums");n = n+1;System.out.println(n + ". "+args[1]+" nosaukums "+args[3]+" komandai ir " + obj+".");} if (args.length>4){String sql2 = "Select value(B).Nosaukums FROM TABLE(select A."+ args[4] +" FROM " + args[0] + " A where " + args[2]+"=?) B"; PreparedStatement pstmt2 = savienz.prepareStatement(sql2); pstmt2.setString(1,args[3]); ResultSet Ieraksti2 = pstmt2.executeQuery(); n=0; while(Ieraksti2.next()){String obj = Ieraksti2.getString("value(b).Nosaukums");n = n+1;System.out.println(n + ". "+args[4]+" nosaukums "+args[3]+" komandai ir " + obj+".");} pstmt2.close(); } System.out.println(sql); pstmt.close();} catch (SQLException e) { System.err.println(e.getMessage()); } }}Kā redzams kodā, ir at??irība starp programmas darbību, ja funkcijā definēti ?etri vai ja funkcijā definēti pieci atribūti. ?etri definētie atribūti norāda attiecīgi tabulas nosaukumu, kolekcijas nosaukumu, tabulas rindas identificējo?ā atribūta nosaukumu un ?ī atribūta vērtību. Piektais atribūts ir vēl viens kolekcijas nosaukums. Ja tas tiek norādīts, tiek izpildīta arī ?īs kolekcijas izvade (kolekcijai jābūt tajā pa?ā tabulā). Izmantoju PreparedStatement iespēju norādīt identificējo?ā atribūta vērtību ar jautājuma zīmi un definēt, kāda vērtība ir ievadīta vaicājuma izpildes laikā. Problēma ir tāda, ka bija nepiecie?ams izmantot args[] mainīgos vaicājuma tekstā tik un tā, jo ?īs jautājuma zīmes nevar saturēt lauku un tabulu vērtības, tikai parastus mainīgos.Tālāk jāapraksta procedūras ?īs programmu klases izmanto?anai, kur es izvēlējos vienkār?i papildināt jau eso?o paketi kol: create or replacePACKAGE kol ASPROCEDURE iev (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac VARCHAR2, objekts VARCHAR2);PROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2);PROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2, otr_kol_nos VARCHAR2);END;create or replacePACKAGE BODY kol ASPROCEDURE iev (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac VARCHAR2, objekts VARCHAR2) AS LANGUAGE JAVANAME 'kol_iev.main(java.lang.String[])';PROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2) AS LANGUAGE JAVANAME 'kol_izv.main(java.lang.String[])';PROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2, otr_kol_nos VARCHAR2) AS LANGUAGE JAVANAME 'kol_izv.main(java.lang.String[])';END;Definēju divas jaunās izv procedūras, kur abām norādīju vienu un to pa?u java klasi. ?ī pārlāde at?auj izpildīt līdzīgas darbības ar vienu un to pa?u procedūras nosaukumu un to izmanto?ana ir līdzīga pārlādētu meto?u lieto?anai.Tagad apskatīsim, vai izveidotais lietojums vispār strādā. Izmanto?u sqlplus programmu.Pirmajā procedūras izsaukumā norādīju 5 atribūtus un izsaucu gan pabeigto, gan nepabeigto programmu izvadi. Otrajā izsaukumā ievadīju 4 atribūtus un izvadīju tikai komandas Dzoniji pabeigtās programmas.Kā redzams, katrā no izsaukumiem tika izvadītas attiecīgo komandu programmas tā, kā bija paredzēts procedūrā. Tātad java programma strādā tā, kā paredzēts.6. Metodes definē?ana ar JAVA klasi un tās pielieto?ana Veido?u jaunu objektu tipu TILPUMS, kurā būs norādītas augstuma, garuma un platuma vērtības, kā arī MEMBER metodi TILP_APR, kas veiks tilpuma aprē?inā?anu.create or replace type TILPUMS as object(AUGSTUMS number,GARUMS number,PLATUMS number,Member function TILP_APR return number);Tālāk definē?u tilpuma aprē?ina funkciju.create or replacetype body TILPUMS asMEMBER function TILP_APR return number isbeginreturn (java_tilp_apr(SELF.AUGSTUMS, SELF.GARUMS,SELF.PLATUMS));end TILP_APR;end;?eit es norādīju uz funkciju java_tilp_apr. Tās izklāsts:create or replaceFUNCTION java_tilp_apr(AUGSTUMS IN NUMBER,GARUMS IN NUMBER,PLATUMS IN NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'tilp_met.vertiba(java.lang.Integer,java.lang.Integer,java.lang.Integer) returnjava.lang.int';?eit norādīta java klases izsauk?ana līdzīgi kā iepriek?ējos procedūru izveides aprakstos, bet, at??irībā no tām, jānorāda ir arī tās vērtība tips, kas atgriezīsies pēc metodes izpildes.Java pirmteksts:import java.sql.*;import oracle.jdbc.*;import java.util.*;import java.io.*;public class tilp_met{public static int vertiba(Integer arg1,Integer arg2,Integer arg3) throws SQLException{ return (arg1*arg2*arg3);}}?is mazais piemērs veiksmīgi parāda, kā member metodes var sasaistīt ar java kla?u metodēm. Tālāk veiksim datu ievadī?anu un izgū?anu:INSERT INTO TILPUMI VALUES('8','5','4')INSERT INTO TILPUMI VALUES('7','3','3')INSERT INTO TILPUMI VALUES('4','2','9')select value(T).Platums,value(T).Garums,value(T).augstums,value(T).TILP_APR() FROM TILPUMI T;8*4*5=160, 9*7=63 un 9*8 =72, tātad aprē?ins strādā.Protams, var veidot daudz sare??ītākus vienādojumus sare??ītākiem objektiem un veikt da?ādas darbības ar objekta atribūtiem un JAVA metodēm, glu?i kā to var darīt ar parastām MEMBER metodēm. Tā jau k?ūst par kodē?anas lo?ikas problēmu, bet, manuprāt, uzdevuma mēr?is ir demonstrēt JAVA metodes izmanto?anas pamata principu. Vēl viens interesants jautājums ir, ja darbības var izdarīt ar tām pa?ām definētajām MEMBER metodēm, priek? kam vispār vajag darboties ar JAVA kla?u metodēm. To dara tādē?, ka, ja es piemēram veidotu vēl vienu metodi citam objektam, kurai vajag tilpuma aprē?inu, es varu ?ajā objekta member metodē arī vienkār?i izsaukt java_tilp_met metodi, kas tālāk darbosies tāpat, kā tā darbojas ar tilpums objekta metodi. Tas ir tādē?, ka JAVA klasei neinteresē no kurienes tiek ielasīti trīs skait?u atribūti, tik ilgi kamēr tie ir skait?i, JAVA klase izpildīs savu algoritmu un atgriezīs skaitli, kuru tālāk sa?em objekta member metode, vai arī jebkāda cita metode.Vēl jāatceras tas, ka, protams, definēt no sākuma vajag JAVA klasi, tad metodi, kas izsauc klasi un tad tikai objekta metodi, savādāk būs kompilācijas k?ūda.7. Secinājumi1) Uzdevumu izpilde izdevās, ja pie?em, ka uzdevumus sapratu pareizi. ?oreiz bija, manuprāt, diezgan slikti definēti uzdevumi, kā arī ?oti daudz atrisinājumu problēmām bija jāmeklē internetā. Pildot darbu radās nojausma, ka varbūt ?is ir viens no pirmajiem gadiem, kur liels fokuss praktiskajam darbam bija uz ?o tematu, jo da?i no lekciju materiāliem likās nedaudz nepilnvērtīgi, bet par to rakstī?u tālākos secinājumos. Pirms tika izmainīts praktiskā darba uzdevumu saraksts, daudzi no uzdevumiem vispār nebija saprotami, bet, pēc to redi?ē?anas, iz?emot vienu mazu problēmu, kuru apspriedu ar pasniedzēju konsultācijā, uzdevuma noteikumus var saprast. 1. uzdevuma izpilde ir aprakstīta pirmajā noda?ā, otrā otrajā, tre?ā un ceturtā uzdevuma tre?ajā noda?ā, piektā uzdevuma izpilde sestajā noda?ā un sestā piektā un ceturtajā noda?ā.2) Kā darbā iepriek? minēts, sastapos izveides laikā ar daudzām problēmām. Pirmkārt un galvenokārt, dzi?a un java lietojuma k?ūdas. Es aptuveni patērēju pusi izveides laika ar java un oracle JDBC dzi?a (un visu pārējo oracle programmatūru) pareizu uzstādī?anu. Lai gan bija labi norādīt, kur un kā uzstādīt JAVA programmatūru, manuprāt, nebija tik labi norādīts kā rīkoties ar oracle db instalāciju un tās darbam nepiecie?amo sistēmas vides mainīgo definē?ana. Vēl viena lieta, kuru ieteiktu pazi?ot, ir – ja nestrādā jdbc izmantojot javac un java komandlīnijas komandas, vienkār?i izmantojiet, piemēram, eclipse lietojumu, kur projektam var tie?i piedefinēt nepiecie?amo meto?u bibliotēku vai bibliotēkas. Otrā problēma bija materiālu trūkums. ?os komentārus rakstu otrdienas vakarā (11.19) un man nebija nevienas vietas, kur paskatīties kā sasaistīt java kla?u metodes ar objektu member metodēm.3) Darbā ar JAVA klasēm sastapos ar interesantu savienojuma izveides problēmu. Precīzāk sakot, kad mē?ināju atvērt ar sqlplus savienojumu ar datubāzi un tajā izpildīt procedūru, sqlplus programma beidza darbību un ?iesala” ( nedeva nekādu atbildi uz izsaukto procedūru un ne?āva izpildīt citas komandas). Vēlāk noskaidroju, ka, ja izslēdzu vai aizvēru savienojumu iek? sql developer, varēju izpildīt procedūras caur sqlplus, bet nevarēju redzēt tabulās izsaukto procedūru rezultātu, līdz aizvēru sqlplus savienojumu. Tas norāda, ka nevar (vismaz ?ajā datubāzē vai ar ?o dzini) izveidot divus vai vairāk vienlaicīgus savienojumus un kvalitatīvi izpildīt darbības. Manuprāt, tas ir tādē?, ka gan viens, gan otrs atvērtais savienojums datubāzē tiek definēts vienādi – ar noteiktu lietotāja vārdu un paroli, kā arī iespējams IP adresi (visi ?ie atribūti ?ajā gadījumā bija vienādi abiem savienojumiem). 4) Darbs bija viennozīmīgi visgrūtākais no visiem līdz ?im biju?ajiem praktiskajiem darbiem. Liela da?a laika tika patērēta uz iepriek? aprakstītajām problēmām ar jdbc dzi?a darbības izpildī?anu un pāris neskaidrām meto?u struktūru pareizā definē?anā (izprotot to uzbūvi). Parasti lielāku laika proporciju patērē piemēru kodu rakstī?ana un ?ī dokumenta veido?ana, kā apskatāmā datubāzes mehānisma izpēte, bet ?ajā darbā viennozīmīgi lielākā da?a tika pavadīta meklējot informāciju par mehānismiem.8. Lietotā literatūraLekciju materiāli no datubāze..ORACLE dokumentācija.Liels daudzums da?ādu forumu diskusiju. ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download