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 compile java 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 compile java 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 procedure testJava1 as language java name 'TestJava1.test()';
2. 在 command window 里输入
SET SERVEROUTPUT ON;
CALL dbms_java.set_output(2000);
以使 System.out 重定向到当前窗口 ;
在 command window 里输入, exec testpro(‘111’);
即可看到结果:
姓名 :111
PL/SQL procedure successfully completed
1.TestFuc
create or replace function TestFuc(xm in varchar2 ) return VARCHAR2 as language java name 'TestJava.message(java.lang.String) return java.lang.String' ;
2. 调用
Select testfuc(‘ 娃哈哈 ’) from dual;
显示结果 :
Hello, 娃哈哈
3 Oracle Socket 通信
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, String url, 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's Guide
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