soobur

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            2 隨筆 :: 1 文章 :: 1 評論 :: 0 Trackbacks

          2006年6月4日 #

          【環(huán)境】:
          ??? winXP sp2
          ????? oracle 9.2.0.1.0
          【輔助工具】:
          ??? JDeveloper904(寫sqlj代碼用)

          ??? 由于第一次用sqlj,對oracle jvm和觸發(fā)器都不是很了解,所以程序能執(zhí)行成什么樣子也不知道,只能一步一步的摸索……

          【一些很失敗的操作】:

          ??? 1、用9i的OEM來創(chuàng)建java源,沒有在命令行下用loadjava!
          ??? 用JDeveloper寫好了程序之后,直接用OEM創(chuàng)建“java源”,然后把代碼粘貼進(jìn)去,編譯,通過……這樣做看似可以運(yùn)行,實(shí)際上有一些編譯過程中的warning都沒有顯示,所以也不知道到底會不會有錯誤(影響不大,不過建議最好去命令行下去做),但是,這樣創(chuàng)建很容易犯一個致命的錯誤,就是創(chuàng)建的時(shí)候很容易把java文件的包信息忽略,比如,偶的sqlj文件頭是這樣的:
          package com.supermap.subo;

          import sqlj.runtime.*;
          import sqlj.runtime.ref.*;
          import java.sql.*;
          import oracle.sqlj.runtime.*;
          import java.io.File;

          #sql iterator Tuser(Long id , String name);
          public class SqljTest

          在OEM中創(chuàng)建“java源”的時(shí)候直接創(chuàng)建SqljTest,然后把代碼復(fù)制進(jìn)去,編譯可以通過,但是在“java類”下面并沒有相應(yīng)的類生成!而且沒有提示!
          ???
          ??? 2、用OEM去創(chuàng)建PROCEDURE,create or replace procedure test (args varchar2) as language java name 'SqljTest.test(java.lang.String)';(這里也沒有注意到要這樣引用:'com.supermap.subo.SqljTest.test(java.lang.String)';也沒有任何的錯誤提示,編譯一直是Valid!)
          ???
          ??? 3、用OEM創(chuàng)建觸發(fā)器:create or replace trigger test after update of NAME on T_USER for each row CALL test2(:old.NAME) ,這么創(chuàng)建倒是沒什么問題,不過總是提示ORA-00963:缺少表達(dá)式!后來證明用同樣的語句到sqlplus下去創(chuàng)建,不會有錯誤!

          【成功的操作】:
          ??? 1、編寫sqlj代碼:
          package com.supermap.subo;

          import sqlj.runtime.*;
          import sqlj.runtime.ref.*;
          import java.sql.*;
          import oracle.sqlj.runtime.*;
          import java.io.File;

          #sql iterator Tuser(Long id , String name);
          public class SqljTest
          {
          ? public static void test(String args)
          ??? {
          ??? try
          ??? {
          ????? Oracle.connect("jdbc:oracle:thin:@localhost:1521:SOOBUR","SYSTEM","supermap");?
          ????? Tuser u;
          ????? #sql
          ??????? u = { SELECT ID,NAME FROM SOOBUR.T_USER WHERE ID = 1 };
          ??????? while(u.next())
          ??????? {
          ????????? System.out.println(u.name());
          ????????? if (u.name().equals("user_8762886"))
          ????????? {
          ??????????? File fo = new File("c:/test.txt");
          ??????????? fo.createNewFile();
          ????????? }
          ??????? }
          ??? } catch (Exception ex)
          ??? {
          ????? ex.printStackTrace();
          ??? }
          ? }
          }
          ??? 2、乖乖的到命令行下去loadjava:loadjava -user [username]/[pass]@SID -o -v -r ./SqljTest.sqlj
          這回有提示了:
          errors?? : source com/supermap/subo/SqljTest
          ??? com/supermap/subo/SqljTest:18: Warning: 從 NUMERIC(38) 轉(zhuǎn)換到列 java.lang.Long id 時(shí), 可能會降低精度。
          ????????? #sql
          ????????? ^
          ???? Info: 1 warnings
          問題不大,這個時(shí)候再打開OEM看一下,“java源”顯示的是com/supermap/subo/SqljTest名字明顯的不一樣了!“java類”下面也有了相應(yīng)的目錄結(jié)構(gòu)和類!
          ??? 3、登陸到sqlplus,create or replace procedure test (args varchar2) as language java name 'SqljTest.test(java.lang.String)';
          ????? 4、create or replace trigger test after update of NAME on T_USER for each row CALL test2(:old.NAME)
          ????? 5、然后隨便update一條記錄,成功!test.txt也創(chuàng)建成功(原來以為oracle的jvm可能會受限制,不能隨便對其他目錄進(jìn)行讀寫,現(xiàn)在看來不是這樣的^_^)!

          【小節(jié)一下】 :
          ??? 做試驗(yàn)的時(shí)候千萬不要怕麻煩!一定要乖乖的到命令行下去一句一句的敲!尤其是像偶這樣初學(xué)的xdjm們!好像用OEM可視化的操作很方便,其實(shí)很多錯誤都被忽略了,結(jié)果自然是不成功了!動輒半天時(shí)間耗進(jìn)去,多不值得!而且oracle的錯誤提示實(shí)在是%#×)#……,比如:“ORA-00963:缺少表達(dá)式!”、“ORA-04088: 觸發(fā)器 'SOOBUR.TEST' 執(zhí)行過程中出錯”等等……實(shí)在讓人是摸不著頭腦!
          ???
          ??? 偶的運(yùn)氣還是不錯的,試了小半天,終于成功了^_^!
          ??? 寫出來和大家共享,希望老鳥們多多指教,多多糾錯,希望跟偶一樣的菜鳥們吸取偶的教訓(xùn)^_^
          ???
          ???

          posted @ 2006-06-04 14:03 soobur 閱讀(1138) | 評論 (1)編輯 收藏

          主站蜘蛛池模板: 潜江市| 库车县| 望奎县| 苗栗市| 永福县| 上虞市| 蓬安县| 大同县| 洞头县| 丁青县| 延长县| 贵阳市| 溆浦县| 湾仔区| 鄯善县| 雷山县| 门源| 湟源县| 通渭县| 屏东县| 永善县| 工布江达县| 阳山县| 新余市| 张家港市| 兴义市| 体育| 昌图县| 谢通门县| 来安县| 贡嘎县| 中阳县| 炉霍县| 金湖县| 招远市| 望都县| 漠河县| 武鸣县| 京山县| 邵东县| 大埔县|