SQLJÀÇ Á¤Àû SQL¹®Àº SQLJÀý¿¡ ³ªÅ¸³³´Ï´Ù. SQLJÀýÀº Java ÇÁ·Î±×·¥ÀÇ SQL¹®¿¡¼ µ¥ÀÌÅͺ£À̽º¿Í Åë½ÅÇÏ´Â µ¥ »ç¿ëÇÏ´Â ¸ÞÄ«´ÏÁòÀÔ´Ï´Ù.
SQLJ º¯È¯ ÇÁ·Î±×·¥¿¡¼´Â ´ÙÀ½°ú °°Àº ±¸Á¶ ¶§¹®¿¡ SQLJÀý°ú SQL¹®À» ÀνÄÇÕ´Ï´Ù.
°¡Àå °£´ÜÇÑ SQLJÀýÀº ½ÇÇà °¡´É ÀýÀ̸ç #sql ÅäÅ«°ú °ýÈ£ ¾ÈÀÇ SQL¹® ¼øÀ¸·Î ±¸¼ºµË´Ï´Ù. ¿¹¸¦ µé¾î, Java ¸í·É¹®ÀÌ ÀϹÝÀûÀ¸·Î ³ªÅ¸³ª´Â À§Ä¡¿¡ ´ÙÀ½ SQLJÀýÀÌ ³ªÅ¸³¯ ¼ö ÀÖ½À´Ï´Ù. ¸í·É¹®ÀÇ ¸ñÀûÀº TAB Å×À̺íÀÇ ¸ðµç ÇàÀ» »èÁ¦ÇÏ´Â °ÍÀÔ´Ï´Ù.
#sql { DELETE FROM TAB };
SQLJ ½ÇÇà °¡´É Àý¿¡¼ °ýÈ£ ¾È¿¡ ³ªÅ¸³ª´Â ÅäÅ«Àº È£½ºÆ® º¯¼ö¸¦ Á¦¿ÜÇÑ SQL ÅäÅ«ÀÔ´Ï´Ù. º¯È¯ ÇÁ·Î±×·¥¿¡¼ ½Äº°ÇÒ ¼ö ÀÖµµ·Ï ¸ðµç È£½ºÆ® º¯¼ö´Â ÄÝ·Ð ¹®ÀÚ·Î ±¸ºÐµË´Ï´Ù. SQL ÅäÅ«Àº SQLJ ½ÇÇà °¡´É ÀýÀÇ °ýÈ£ ¹Û¿¡¼ ³ªÅ¸³ªÁö´Â ¾Ê½À´Ï´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ Java ¸Þ¼Òµå´Â SQL Å×ÀÌºí¿¡ ±× Àμö¸¦ »ðÀÔÇÕ´Ï´Ù. ¸Þ¼Òµå º»¹®Àº È£½ºÆ® º¯¼ö x, y ¹× z¸¦ Æ÷ÇÔÇÏ´Â SQLJ ½ÇÇà °¡´É Àý·Î ±¸¼ºµË´Ï´Ù.
void m (int x, String y, float z) throws SQLException { #sql { INSERT INTO TAB1 VALUES (:x, :y, :z) }; }
ÀϹÝÀûÀ¸·Î SQL ÅäÅ«Àº ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏÁö ¾ÊÀ¸¸ç(ÀÌÁß ÀοëºÎÈ£·Î ºÐ¸®µÇ´Â ½Äº°ÀÚ Á¦¿Ü) ´ë¹®ÀÚ, ¼Ò¹®ÀÚ ¶Ç´Â ´ë¼Ò¹®ÀÚ È¥ÇÕÀ¸·Î ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª Java ÅäÅ«Àº ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÕ´Ï´Ù. ¿¹¿¡¼´Â ¸íÈ®¼ºÀ» À§ÇØ ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏÁö ¾Ê´Â SQLÀº ´ë¹®ÀÚ·Î, Java ÅäÅ«À¸·Î ¼Ò¹®ÀÚ³ª ´ë¼Ò¹®ÀÚ È¥ÇÕÀ¸·Î Ç¥½ÃÇß½À´Ï´Ù. ÀÌ Àå Àüü¿¡¼ ¼Ò¹®ÀÚ nullÀº Java "³Î(null)" °ªÀ» Ç¥½ÃÇÏ´Â µ¥ »ç¿ëÇÏ¸ç ´ë¹®ÀÚ NULLÀº SQL ³Î(null) °ªÀ» Ç¥½ÃÇÏ´Â µ¥ »ç¿ëÇÕ´Ï´Ù.
Å×ÀÌºí¿¡¼ µ¥ÀÌÅ͸¦ °Ë»öÇÏ´Â SQL¹®°ú ´Þ¸® À§Ä¡ ÁöÁ¤µÈ UPDATE ¹× DELETE ÀÛ¾÷À» ¼öÇàÇÏ´Â ÀÀ¿ëÇÁ·Î±×·¥ ¶Ç´Â º¸À¯ °¡´É¼º ¶Ç´Â ¸®ÅÏ °¡´É¼º ¼Ó¼ºÀÇ ¹Ýº¹±â¸¦ »ç¿ëÇÏ´Â °ÍÀº µÎ Java ¼Ò½º ÆÄÀÏÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¹Ýº¹±â¸¦ ÇϳªÀÇ ¼Ò½º ÆÄÀÏ¿¡¼ °ø¿ëÀ¸·Î ¼±¾ðÇϰí, with¿Í implementsÀýÀ» ÀûÀýÈ÷ Ãß°¡ÇϽʽÿÀ.
º¸À¯ °¡´É¼º ¶Ç´Â ¸®ÅÏ °¡´É¼º ¼Ó¼ºÀÇ °ªÀ» ¼³Á¤ÇÏ·Á¸é, ÇØ´ç ¼Ó¼º¿¡ ´ëÇØ withÀýÀ» »ç¿ëÇÏ¿© ¹Ýº¹±â¸¦ ¼±¾ðÇØ¾ß ÇÕ´Ï´Ù. ´ÙÀ½ ¿¹´Â º¸À¯ °¡´É¼º ¼Ó¼ºÀ» WithHoldCurs ¹Ýº¹±â¿¡ ´ëÇØ ÂüÀ¸·Î ¼³Á¤ÇÕ´Ï´Ù.
#sql public iterator WithHoldCurs with (holdability=true) (String EmpNo);
À§Ä¡ ÁöÁ¤µÈ °»½ÅÀ» ¼öÇàÇÏ´Â ¹Ýº¹±â´Â sqlj.runtime.ForUpdate ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â implementsÀýÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, file1.sqlj¿¡¼ ´ÙÀ½°ú °°ÀÌ DelByName ¹Ýº¹±â¸¦ ¼±¾ðÇÑ´Ù°í °¡Á¤ÇϽʽÿÀ.
#sql public iterator DelByName implements sqlj.runtime.ForUpdate(String EmpNo);
±×·± ´ÙÀ½¿¡´Â ´Ù¸¥ ¼Ò½º ÆÄÀÏ¿¡¼ º¯È¯µÇ¾úÀ¸¸ç ÄÄÆÄÀÏµÈ ¹Ýº¹±â¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹Ýº¹±â¸¦ »ç¿ëÇÏ·Á¸é ´ÙÀ½À» ½ÇÇàÇϽʽÿÀ.
file2.sqlj¿¡¼ À§Ä¡ ÁöÁ¤µÈ DELETE¿¡ ´ëÇØ DelByNameÀ» »ç¿ëÇÏ·Á¸é, À§Ä¡ ÁöÁ¤µÈ ¹Ýº¹±â¸¦ »ç¿ëÇÏ¿© Çà »èÁ¦¿¡¼¿Í °°Àº ¸í·É¹®À» ½ÇÇàÇϽʽÿÀ.
{ DelByName deliter; // Declare object of DelByName class String enum; (1) #sql deliter = { SELECT EMPNO FROM EMP WHERE WORKDEPT='D11'}; while (deliter.next()) { (2) enum = deliter.EmpNo(); // Get value from result table (3) #sql { DELETE WHERE CURRENT OF :deliter }; // Delete row where cursor is positioned } }
ÁÖ:
´ÙÀ½ ¿¹Á¦ SQLJ ÀÀ¿ëÇÁ·Î±×·¥ App.sqlj ¿¡¼´Â Á¤Àû SQLÀ» »ç¿ëÇÏ¿© DB2 »ùÇà µ¥ÀÌÅͺ£À̽ºÀÇ EMPLOYEE Å×ÀÌºí¿¡¼ µ¥ÀÌÅ͸¦ °Ë»öÇÏ°í °»½ÅÇÕ´Ï´Ù.
import java.sql.*; import sqlj.runtime.*; import sqlj.runtime.ref.*; #sql iterator App_Cursor1 (String empno, String firstnme) ; (1) #sql iterator App_Cursor2 (String) ; class App { /********************** ** Register Driver ** **********************/ static { try { Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance(); } catch (Exception e) { e.printStackTrace(); } } /******************** ** Main ** ********************/ public static void main(String argv[]) { try { App_Cursor1 cursor1; App_Cursor2 cursor2; String str1 = null; String str2 = null; long count1; // URL is jdbc:db2:dbname String url = "jdbc:db2:sample"; DefaultContext ctx = DefaultContext.getDefaultContext(); if (ctx == null) { try { // connect with default id/password Connection con = DriverManager.getConnection(url); con.setAutoCommit(false); ctx = new DefaultContext(con); } catch (SQLException e) { System.out.println("Error: could not get a default context"); System.err.println(e) ; System.exit(1); } DefaultContext.setDefaultContext(ctx); } // retrieve data from the database System.out.println("Retrieve some data from the database."); #sql cursor1 = {SELECT empno, firstnme FROM employee}; (2) // display the result set // cursor1.next() returns false when there are no more rows System.out.println("Received results:"); while (cursor1.next()) (3) { str1 = cursor1.empno(); (4) str2 = cursor1.firstnme(); System.out.print (" empno= " + str1); System.out.print (" firstname= " + str2); System.out.print (""); } cursor1.close(); (9) // retrieve number of employee from the database #sql { SELECT count(*) into :count1 FROM employee }; (5) if (1 == count1) System.out.println ("There is 1 row in employee table"); else System.out.println ("There are " + count1 + " rows in employee table"); // update the database System.out.println("Update the database. "); #sql { UPDATE employee SET firstnme = 'SHILI' WHERE empno = '000010' }; // retrieve the updated data from the database System.out.println("Retrieve the updated data from the database."); str1 = "000010"; #sql cursor2 = {SELECT firstnme FROM employee WHERE empno = :str1}; (6) // display the result set // cursor2.next() returns false when there are no more rows System.out.println("Received results:"); while (true) { #sql { FETCH :cursor2 INTO :str2 }; (7) if (cursor2.endFetch()) break; (8) System.out.print (" empno= " + str1); System.out.print (" firstname= " + str2); System.out.print (""); } cursor2.close(); (9) // rollback the update System.out.println("Rollback the update."); #sql { ROLLBACK work }; System.out.println("Rollback done."); } catch( Exception e ) { e.printStackTrace(); } } }
Embedded SQL¹®ÀÇ Àμö´Â È£½ºÆ® º¯¼ö, SQL¹®¿¡ ³ªÅ¸³ È£½ºÆ® ¾ð¾îÀÇ º¯¼ö¸¦ ÅëÇØ Àü´ÞµË´Ï´Ù. È£½ºÆ® º¯¼ö¿¡´Â ÃÖ´ë ¼¼ °¡Áö ºÎºÐÀÌ ÀÖ½À´Ï´Ù.
Java ½Äº°ÀÚÀÇ Æò°¡´Â Java ÇÁ·Î±×·¥¿¡ ºÎ°¡ ÀÛ¿ëÀ» ¹ÌÄ¡Áö ¾ÊÀ¸¹Ç·Î, SQLJ Ŭ·¡½º¸¦ ´ëüÇϱâ À§ÇØ »ý¼ºµÈ Java Äڵ忡 ¿©·¯¹ø ³ªÅ¸³¯ ¼ö ÀÖ½À´Ï´Ù.
´ÙÀ½ Á¶È¸¿¡´Â :x È£½ºÆ® º¯¼ö°¡ ÀÖÀ¸¸ç ÀÌ È£½ºÆ® º¯¼ö´Â Á¶È¸¸¦ Æ÷ÇÔÇÑ ¹üÀ§¿¡ °¡½ÃÀûÀÎ Java º¯¼ö, ÇÊµå ¶Ç´Â ¸Å°³º¯¼ö xÀÔ´Ï´Ù.
SELECT COL1, COL2 FROM TABLE1 WHERE :x > COL3
º¹ÇÕ SQL¿¡ ÁöÁ¤µÈ ¸ðµç È£½ºÆ® º¯¼ö´Â ±âº»ÀûÀ¸·Î ÀԷ ȣ½ºÆ® º¯¼öÀÔ´Ï´Ù. È£½ºÆ® º¯¼ö¸¦ Ãâ·Â È£½ºÆ® º¯¼ö·Î Ç¥½ÃÇÏ·Á¸é È£½ºÆ® º¯¼ö ¾Õ¿¡ ¸Å°³º¯¼ö ¸ðµå ½Äº°ÀÚ OUT ¶Ç´Â INOUTÀ» ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½°ú °°½À´Ï´Ù.
#sql {begin compound atomic static select count(*) into :OUT count1 from employee; end compound}
µ¥ÀÌÅͺ£À̽º¿¡´Â ÀúÀå ÇÁ·Î½Ãµà¾î, »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö ±×¸®°í »ç¿ëÀÚ Á¤ÀÇ ¸Þ¼Òµå°¡ µé¾î ÀÖ½À´Ï´Ù. ÀúÀå ÇÁ·Î½Ãµà¾î, »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö ±×¸®°í »ç¿ëÀÚ Á¤ÀÇ ¸Þ¼Òµå´Â µ¥ÀÌÅͺ£À̽º¿¡¼ ½ÇÇàµÇ´Â ¸í¸íµÈ ½ºÅ°¸¶ ¿ÀºêÁ§Æ®ÀÔ´Ï´Ù. Java ¸í·É¹®À¸·Î ³ªÅ¸³ª´Â SQLJ ½ÇÇà °¡´É Àý¿¡¼ ´ÙÀ½°ú °°Àº CALL¹®À» ÅëÇØ ÀúÀå ÇÁ·Î½Ãµà¾î¸¦ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.
#sql { CALL SOME_PROC(:INOUT myarg) };
ÀúÀå ÇÁ·Î½Ãµà¾î¿¡´Â IN, OUT ¶Ç´Â INOUT ¸Å°³º¯¼ö°¡ µé¾î°¥ ¼ö ÀÖ½À´Ï´Ù. À§ÀÇ °æ¿ì¿¡ myarg È£½ºÆ® º¯¼öÀÇ °ªÀº ±× ÀýÀÇ ½ÇÇàÀ¸·Î º¯°æµË´Ï´Ù. SQLJ ½ÇÇà °¡´É Àý¿¡¼ SQL VALUES ±¸¼ºÀ» ÅëÇØ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, Á¤¼ö¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö F¸¦ °¡Á¤ÇϽʽÿÀ. ´ÙÀ½ ¿¹´Â ±× ÇÔ¼öÀÇ È£ÃâÀ» ³ªÅ¸³½ ´ÙÀ½ Java Áö¿ª º¯¼ö x¿¡ ±× °á°ú¸¦ ÇÒ´çÇÕ´Ï´Ù.
{ int x; #sql x = { VALUES( F(34) ) }; }
MyClass ÇÁ·Î±×·¥ À̸§À¸·Î SQLJ ÇÁ·Î±×·¥À» ¼öÇàÇÏ·Á¸é ´ÙÀ½À» ½ÇÇàÇϽʽÿÀ.
sqlj MyClass.sqlj
sqlj.properties ÆÄÀÏÀ» ÁöÁ¤ÇÏÁö ¾Ê°í SQLJ º¯È¯ ÇÁ·Î±×·¥À» »ç¿ëÇÏ¸é º¯È¯ ÇÁ·Î±×·¥¿¡¼ ´ÙÀ½ °ªÀ» »ç¿ëÇÕ´Ï´Ù.
sqlj.url=jdbc:db2:sample sqlj.driver=COM.ibm.db2.jdbc.app.DB2Driver sqlj.online=sqlj.semantics.JdbcChecker sqlj.offline=sqlj.semantics.OfflineChecker
sqlj.properties ÆÄÀÏÀ» ÁöÁ¤ÇÒ °æ¿ì ´ÙÀ½ ¿É¼ÇÀÌ ¼³Á¤µÇ¾î ÀÖ´ÂÁö È®ÀÎÇϽʽÿÀ.
sqlj.url=jdbc:db2:dbname sqlj.driver=COM.ibm.db2.jdbc.app.DB2Driver sqlj.online=sqlj.semantics.JdbcChecker sqlj.offline=sqlj.semantics.OfflineChecker
¿©±â¼ dbnameÀº µ¥ÀÌÅͺ£À̽ºÀÇ À̸§ÀÔ´Ï´Ù. ¶ÇÇÑ ¸í·ÉÇà¿¡¼ ÀÌ·± ¿É¼ÇÀ» ÁöÁ¤ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, MyClass¸¦ º¯È¯ÇÒ¶§ mydata µ¥ÀÌÅͺ£À̽º¸¦ ÁöÁ¤Çϱâ À§ÇØ ´ÙÀ½ ¸í·ÉÀ» ¹ßÇàÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
sqlj -url=jdbc:db2:mydata MyClass.sqlj
-compile=falseÀý·Î ÄÄÆÄÀÏ ¿É¼ÇÀ» ¸í½ÃÀûÀ¸·Î ¼³Á¤ÇØÁ¦ÇÏÁö ¾Ê´Â ÇÑ SQLJ º¯È¯ ÇÁ·Î±×·¥¿¡¼ Ŭ·¡½º ÆÄÀÏ·Î ¼Ò½º Äڵ带 ÀÚµ¿À¸·Î º¯È¯ÇÑ´Ù´Â Á¡¿¡ ÁÖÀÇÇϽʽÿÀ.
db2profc -user=user-name -password=user-password -url=jdbc:db2:dbname -prepoptions="bindfile using MyClass0.bnd package using MyClass0" MyClass_SJProfile0.ser db2profc -user=user-name -password=user-password -url=jdbc:db2:dbname -prepoptions="bindfile using MyClass1.bnd package using MyClass1" MyClass_SJProfile1.ser ...
java MyClass
º¯È¯ ÇÁ·Î±×·¥¿¡¼´Â SQLJÀÌ »ç¿ëÀÚ Á¤ÀÇµÈ µ¥ÀÌÅͺ£À̽º¿¡ ´ëÇÑ SQL ±¸¹®À» »ý¼ºÇÕ´Ï´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°½À´Ï´Ù.
i = { VALUES ( F(:x) ) };
ÀÌ ±¸¹®Àº SQLJ º¯È¯ ÇÁ·Î±×·¥À¸·Î º¯È¯µÇ¸ç
? = VALUES (F (?))
»ý¼ºµÈ ÇÁ·ÎÆÄÀÏ¿¡ ÀúÀåµË´Ï´Ù. DB2 Universal Database µ¥ÀÌÅͺ£À̽º¿¡ ¿¬°áÇϸé DB2¿¡¼ VALUE¹®À» ´ÙÀ½À¸·Î »ç¿ëÀÚ Á¤ÀÇÇÕ´Ï´Ù.
VALUES(F(?)) INTO ?
±×·¯³ª OS/390¿ë DB2 Universal Database µ¥ÀÌÅͺ£À̽º¿¡ ¿¬°áÇϸé DB2¿¡¼ VALUE¹®À» ´ÙÀ½À¸·Î »ç¿ëÀÚ Á¤ÀÇÇÕ´Ï´Ù.
SELECT F(?) INTO ? FROM SYSIBM.SYSDUMMY1
DB2 Universal Database µ¥ÀÌÅͺ£À̽º¿¡ ´ëÇØ DB2 SQLJ ÇÁ·ÎÆÄÀÏ »ç¿ëÀÚ Á¤ÀÇ ÇÁ·Î±×·¥ db2profc¸¦ ¼öÇàÇÏ¿© ¹ÙÀÎµå ÆÄÀÏÀ» »ý¼ºÇÒ °æ¿ì ¹ÙÀÎµå ÆÄÀÏ¿¡ VALUESÀýÀÌ ÀÖÀ¸¸é ¹ÙÀÎµå ÆÄÀÏÀ» »ç¿ëÇÏ¿© OS/390¿ë DB2 µ¥ÀÌÅͺ£À̽º¿¡ ¹ÙÀεåÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ·± ³»¿ëÀº OS/390¿ë DB2 µ¥ÀÌÅͺ£À̽º¿¡ ´ëÇØ ¹ÙÀÎµå ÆÄÀÏÀ» »ý¼ºÇÏ¿© DB2 Universal Database µ¥ÀÌÅͺ£À̽º¿¡ ¹ÙÀεåÇÏ·Á´Â °æ¿ì¿¡µµ Àû¿ëµË´Ï´Ù.
DB2 SQLJ ÇÁ·Î±×·¥ ºôµå ¹× ¼öÇà¿¡ ´ëÇØ¼´Â ÀÀ¿ëÇÁ·Î±×·¥ ºôµå ¾È³»¼¿¡¼ ÀÚ¼¼ÇÑ ³»¿ëÀ» ÂüÁ¶ÇϽʽÿÀ.
SQLJ º¯È¯±â´Â DB2 PRECOMPILE ¸í·É°ú °°Àº »çÀü ó¸® ÄÄÆÄÀÏ ¿É¼ÇÀ» Áö¿øÇÕ´Ï´Ù. ´ÙÀ½Àº ¿¹¿Ü»çÇ×ÀÔ´Ï´Ù.
CONNECT DISCONNECT DYNAMICRULES NOLINEMACRO OPTLEVEL OUTPUT SQLCA SQLFLAG SQLRULES SYNCPOINT TARGET WCHARTYPE
SQLJ º¯È¯ ÇÁ·Î±×·¥¿¡¼ »ý¼ºÇÑ ÇÁ·ÎÆÄÀÏÀÇ ³»¿ëÀ» ÀÏ¹Ý ÅØ½ºÆ®·Î ÀμâÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ profp À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇϽʽÿÀ.
profp MyClass_SJProfile0.ser profp MyClass_SJProfile1.ser ...
ÇÁ·ÎÆÄÀÏÀÇ DB2 »ç¿ëÀÚ Á¤ÀÇ ¹öÀüÀÇ ³»¿ëÀ» ÀÏ¹Ý ÅØ½ºÆ®·Î ÀμâÇÏ·Á¸é db2profp À¯Æ¿¸®Æ¼¸¦ ´ÙÀ½°ú °°ÀÌ »ç¿ëÇϽʽÿÀ. ¿©±â¼ dbnameÀº µ¥ÀÌÅͺ£À̽ºÀÇ À̸§ÀÔ´Ï´Ù.
db2profp -user=user-name -password=user-password -url=jdbc:db2:dbname MyClass_SJProfile0.ser db2profp -user=user-name -password=user-password -url=jdbc:db2:dbname MyClass_SJProfile1.ser ...