﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-soobur</title><link>http://www.blogjava.net/soobur/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 12:27:03 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 12:27:03 GMT</pubDate><ttl>60</ttl><item><title>用sqlj编写oracle触发器成功记^_^</title><link>http://www.blogjava.net/soobur/archive/2006/06/04/50258.html</link><dc:creator>soobur</dc:creator><author>soobur</author><pubDate>Sun, 04 Jun 2006 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/soobur/archive/2006/06/04/50258.html</guid><wfw:comment>http://www.blogjava.net/soobur/comments/50258.html</wfw:comment><comments>http://www.blogjava.net/soobur/archive/2006/06/04/50258.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/soobur/comments/commentRss/50258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/soobur/services/trackbacks/50258.html</trackback:ping><description><![CDATA[
		<p>【环境】：<br />    winXP sp2<br />      oracle 9.2.0.1.0<br />【辅助工具】：<br />    JDeveloper904（写sqlj代码用）</p>
		<p>    由于第一次用sqlj，对oracle jvm和触发器都不是很了解，所以程序能执行成什么样子也不知道，只能一步一步的摸索……</p>
		<p>【一些很失败的操作】：</p>
		<p>    1、用9i的OEM来创建java源，没有在命令行下用loadjava！<br />    用JDeveloper写好了程序之后，直接用OEM创建“java源”，然后把代码粘贴进去，编译，通过……这样做看似可以运行，实际上有一些编译过程中的warning都没有显示，所以也不知道到底会不会有错误（影响不大，不过建议最好去命令行下去做），但是，这样创建很容易犯一个致命的错误，就是创建的时候很容易把java文件的包信息忽略，比如，偶的sqlj文件头是这样的：<br />package com.supermap.subo;</p>
		<p>import sqlj.runtime.*;<br />import sqlj.runtime.ref.*;<br />import java.sql.*;<br />import oracle.sqlj.runtime.*;<br />import java.io.File;</p>
		<p>#sql iterator Tuser(Long id , String name);<br />public class SqljTest </p>
		<p>在OEM中创建“java源”的时候直接创建SqljTest，然后把代码复制进去，编译可以通过，但是在“java类”下面并没有相应的类生成！而且没有提示！<br />    <br />    2、用OEM去创建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！）<br />    <br />    3、用OEM创建触发器：create or replace trigger test after update of NAME on T_USER for each row CALL test2(:old.NAME) ，这么创建倒是没什么问题，不过总是提示ORA-00963:缺少表达式！后来证明用同样的语句到sqlplus下去创建，不会有错误！</p>
		<p>【成功的操作】：<br />    1、编写sqlj代码：<br />package com.supermap.subo;</p>
		<p>import sqlj.runtime.*;<br />import sqlj.runtime.ref.*;<br />import java.sql.*;<br />import oracle.sqlj.runtime.*;<br />import java.io.File;</p>
		<p>#sql iterator Tuser(Long id , String name);<br />public class SqljTest <br />{<br />  public static void test(String args)<br />    {<br />    try <br />    {<br />      Oracle.connect("jdbc:oracle:thin:@localhost:1521:SOOBUR","SYSTEM","supermap");  <br />      Tuser u;<br />      #sql <br />        u = { SELECT ID,NAME FROM SOOBUR.T_USER WHERE ID = 1 };<br />        while(u.next())<br />        {<br />          System.out.println(u.name());<br />          if (u.name().equals("user_8762886")) <br />          {<br />            File fo = new File("c:/test.txt");<br />            fo.createNewFile();<br />          }<br />        }<br />    } catch (Exception ex) <br />    {<br />      ex.printStackTrace();<br />    } <br />  }<br />}<br />    2、乖乖的到命令行下去loadjava：loadjava -user [username]/[pass]@SID -o -v -r ./SqljTest.sqlj<br />这回有提示了：<br />errors   : source com/supermap/subo/SqljTest<br />    com/supermap/subo/SqljTest:18: Warning: 从 NUMERIC(38) 转换到列 java.lang.Long id 时, 可能会降低精度。<br />          #sql<br />          ^<br />     Info: 1 warnings<br />问题不大，这个时候再打开OEM看一下，“java源”显示的是com/supermap/subo/SqljTest名字明显的不一样了！“java类”下面也有了相应的目录结构和类！<br />    3、登陆到sqlplus，create or replace procedure test (args varchar2) as language java name 'SqljTest.test(java.lang.String)';<br />      4、create or replace trigger test after update of NAME on T_USER for each row CALL test2(:old.NAME)<br />      5、然后随便update一条记录，成功！test.txt也创建成功（原来以为oracle的jvm可能会受限制，不能随便对其他目录进行读写，现在看来不是这样的^_^）！</p>
		<p>【小节一下】 ：<br />    做试验的时候千万不要怕麻烦！一定要乖乖的到命令行下去一句一句的敲！尤其是像偶这样初学的xdjm们！好像用OEM可视化的操作很方便，其实很多错误都被忽略了，结果自然是不成功了！动辄半天时间耗进去，多不值得！而且oracle的错误提示实在是％＃×）＃……，比如：“ORA-00963:缺少表达式！”、“ORA-04088: 触发器 'SOOBUR.TEST' 执行过程中出错”等等……实在让人是摸不着头脑！<br />    <br />    偶的运气还是不错的，试了小半天，终于成功了^_^！<br />    写出来和大家共享，希望老鸟们多多指教，多多纠错，希望跟偶一样的菜鸟们吸取偶的教训^_^<br />    <br />    </p>
<img src ="http://www.blogjava.net/soobur/aggbug/50258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/soobur/" target="_blank">soobur</a> 2006-06-04 14:03 <a href="http://www.blogjava.net/soobur/archive/2006/06/04/50258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The First</title><link>http://www.blogjava.net/soobur/archive/2006/05/09/45312.html</link><dc:creator>soobur</dc:creator><author>soobur</author><pubDate>Tue, 09 May 2006 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/soobur/archive/2006/05/09/45312.html</guid><wfw:comment>http://www.blogjava.net/soobur/comments/45312.html</wfw:comment><comments>http://www.blogjava.net/soobur/archive/2006/05/09/45312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/soobur/comments/commentRss/45312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/soobur/services/trackbacks/45312.html</trackback:ping><description><![CDATA[    好久不写blog了，记得以前写是因为本科上专业课时候老师要求，作为平时成绩的评定标准，blog上面自然都是一些课程的笔记和随想之类的，与技术无关……回头看看，也蛮有意思的^_^
现在又鼓起勇气打算写些东西了，主要也是本着学习提高的目的，希望被大虾们拍转……<img src ="http://www.blogjava.net/soobur/aggbug/45312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/soobur/" target="_blank">soobur</a> 2006-05-09 23:56 <a href="http://www.blogjava.net/soobur/archive/2006/05/09/45312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>