<!----><!---->
<!---->
1 介绍
Oracle里可以使用多种语言来编写存储过程,比如Pro*C/C++,PL/SQL,COBOL,在Oracle8i开始支持用Java编写存储过程。
如果非要写存储过程的话,做为以Java谋生的我,首选用Java编写,用PL/SQL需要记忆很多的语法(Pascal类的语法)和函数,远不如使用Java/JDBC这么轻车熟路。而且,DB2等数据库都支持Java存储过程,所以不比为每一种数据学习一种编写存储过程的方法了。
Java存储过程与一般的JDBC程序有所不同的是:
1.有安全限制,毕竟是在oracle内部运行的,不允许访问操作系统的资源,如文件。
2.获取数据库联接方式,connection = new OracleDriver().defaultConnection();
3.System.out,System.err,System.in等输入输出有所不同。可以利用某些命令重定向。
2 例子
下面用Java 存储过程写一个例子。
2.1 JavaSource
在plsqldeveloper里,java source里增加一个TestJava类,
Java代码
create or replace and compilejava source named TestJava as
public class TestJava {
public static void test(String xm) {
System.out.println("姓名:"+xm);
}
public static String message(String xm) {
return "Hello," + xm;
}
}
create or replace and compilejava source named TestJava1 as
public class TestJava1
{
public static void test()
{
System.out.println("Hello");
}
}
执行它,以保存并编译。
2.2 Procedure
1.TestPro
create or replace procedure TestPro(xm in varchar2) as language java name 'TestJava.test(java.lang.String)';
create or replace proceduretestJava1 as language java name 'TestJava1.test()';
2.在command window里输入
SET SERVEROUTPUT ON;
CALL dbms_java.set_output(2000);
以使System.out重定向到当前窗口;
在commandwindow里输入,exec testpro(‘111’);
即可看到结果:
姓名:111
PL/SQL procedure successfully completed
2.3 Function
1.TestFuc
create or replace function TestFuc(xm in varchar2) return VARCHAR2 as language java name 'TestJava.message(java.lang.String) returnjava.lang.String';
2.调用
Select testfuc(‘娃哈哈’) from dual;
显示结果:
Hello,娃哈哈
3 OracleSocket通信
3.1 授权
--授权,用户必须大写
exec dbms_java.grant_permission('TEST','SYS:java.util.PropertyPermission','*', 'read,write' );
exec dbms_java.grant_permission('TEST','SYS:java.net.SocketPermission','*','connect,resolve');
3.2 数据库连接
/**
* 数据库连接(默认)
* @return Connection
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
Connection con = null;
con = new OracleDriver().defaultConnection();
return con;
}
/**
* 数据库连接
* @param driverClassName
* @param url
* @param user
* @param password
* @return Connection
* @throws ClassNotFoundException
* @throws SQLException
*/
public static Connection getConnection(String driverClassName, Stringurl, String user, String password) throws ClassNotFoundException, SQLException {
Connection con = null;
Class.forName(driverClassName);
Properties info = System.getProperties();
info.put("user", user);
info.put("password", password);
con = DriverManager.getConnection(url,info);
return con;
}
4 参考资料
Oracle® Database Java Developer'sGuide
http://download-west.oracle.com/docs/cd/B19306_01/java.102/b14187/toc.htm
Sample:
http://www.oracle.com/technology/sample_code/tech/java/jsp/oracle9ijsp.html
|