soobur

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            2 隨筆 :: 1 文章 :: 1 評論 :: 0 Trackbacks
          【環(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源”,然后把代碼粘貼進去,編譯,通過……這樣做看似可以運行,實際上有一些編譯過程中的warning都沒有顯示,所以也不知道到底會不會有錯誤(影響不大,不過建議最好去命令行下去做),但是,這樣創(chuàng)建很容易犯一個致命的錯誤,就是創(chuàng)建的時候很容易把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源”的時候直接創(chuàng)建SqljTest,然后把代碼復制進去,編譯可以通過,但是在“java類”下面并沒有相應的類生成!而且沒有提示! 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:缺少表達式!后來證明用同樣的語句到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) 轉換到列 java.lang.Long id 時, 可能會降低精度。 #sql ^ Info: 1 warnings 問題不大,這個時候再打開OEM看一下,“java源”顯示的是com/supermap/subo/SqljTest名字明顯的不一樣了!“java類”下面也有了相應的目錄結構和類! 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可能會受限制,不能隨便對其他目錄進行讀寫,現(xiàn)在看來不是這樣的^_^)! 【小節(jié)一下】 : 做試驗的時候千萬不要怕麻煩!一定要乖乖的到命令行下去一句一句的敲!尤其是像偶這樣初學的xdjm們!好像用OEM可視化的操作很方便,其實很多錯誤都被忽略了,結果自然是不成功了!動輒半天時間耗進去,多不值得!而且oracle的錯誤提示實在是%#×)#……,比如:“ORA-00963:缺少表達式!”、“ORA-04088: 觸發(fā)器 'SOOBUR.TEST' 執(zhí)行過程中出錯”等等……實在讓人是摸不著頭腦! 偶的運氣還是不錯的,試了小半天,終于成功了^_^! 寫出來和大家共享,希望老鳥們多多指教,多多糾錯,希望跟偶一樣的菜鳥們吸取偶的教訓^_^
          posted on 2006-06-04 13:11 soobur 閱讀(211) 評論(0)  編輯  收藏 所屬分類: Oracle

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 米脂县| 宁蒗| 新疆| 当阳市| 神池县| 尚志市| 库尔勒市| 尉氏县| 武穴市| 金沙县| 瓮安县| 呼图壁县| 丹江口市| 尉氏县| 长沙县| 华亭县| 江华| 沧州市| 泾源县| 青海省| 锦屏县| 璧山县| 渑池县| 乌拉特后旗| 滦南县| 江口县| 辽中县| 丽江市| 永济市| 清镇市| 行唐县| 民权县| 疏附县| 准格尔旗| 怀化市| 安仁县| 南江县| 喀喇沁旗| 宁乡县| 东兰县| 丽江市|