关于pl/sql调用java的学习总结(附代码)
来源:互联网 发布:最流行的网络词汇 编辑:程序博客网 时间:2024/03/29 10:33
第一,创建orcale中的java对象.
命令:
create or replace and compile java source named "TransMetaData"
as
/*
java code
*/
注意:1.不用写包名.
2.方法必须是static的
3.如果方法需要参数,则需要在第二步,创建带参数的存储过程.
如果方法需要返回值,则需要在第二步,创建带返回值的存储过程.
例如:
create or replace and compile java source named "TransMetaData"
as
import java.io.*;
import java.sql.*;
import java.util.Properties;
import oracle.jdbc.driver.OracleDriver;
public class TransMetaData {
/**
* @param args
* @throws SQLException
* @throws UnsupportedEncodingException
*/
public static void donow(String str) throws FileNotFoundException, IOException,SQLException, UnsupportedEncodingException {
str = "_"+str;
Properties props = new Properties();
props.load(new FileInputStream("c:/tables.properties"));
String DATABAST_SOURCE_URL = props.getProperty("DATABAST_SOURCE_URL"+str);
String DATABAST_SOURCE_USERNAME = props.getProperty("DATABAST_SOURCE_USERNAME"+str);
String DATABAST_SOURCE_PASSWORD = props.getProperty("DATABAST_SOURCE_PASSWORD"+str);
String DATABAST_TARGET_URL = props.getProperty("DATABAST_TARGET_URL"+str);
String DATABAST_TARGET_USERNAME = props.getProperty("DATABAST_TARGET_USERNAME"+str);
String DATABAST_TARGET_PASSWORD = props.getProperty("DATABAST_TARGET_PASSWORD"+str);
String SQL_SOURCE_TABLENAME = props.getProperty("SQL_SOURCE_TABLENAME"+str);
String SQL_TARGET_TABLENAME = props.getProperty("SQL_TARGET_TABLENAME"+str);
String SQL_TABLE_FIELD = props.getProperty("SQL_TABLE_FIELD"+str);
Connection conn = null;
Connection conn_to = null;
DriverManager.registerDriver(new OracleDriver());
conn = DriverManager.getConnection(DATABAST_SOURCE_URL,DATABAST_SOURCE_USERNAME,DATABAST_SOURCE_PASSWORD);
conn_to = DriverManager.getConnection(DATABAST_TARGET_URL,DATABAST_TARGET_USERNAME,DATABAST_TARGET_PASSWORD);
if (!conn.isClosed()&&!conn_to.isClosed()){
System.out.println("**源与目的数据库连接成功**");
conn.setAutoCommit(false);
conn_to.setAutoCommit(false);
}else{
new Exception("源与目的数据库连接不成功,请检查!");
}
PreparedStatement pstmt = conn.prepareStatement("SELECT "+SQL_TABLE_FIELD+" FROM "+SQL_SOURCE_TABLENAME);
ResultSet rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
//numberOfColumns代表源表列的数量
String[] data = new String[numberOfColumns];
String mark = "";
String temp;
PreparedStatement pstmt2 = conn_to.prepareStatement("delete from "+SQL_TARGET_TABLENAME);
pstmt2.executeUpdate();
pstmt2.close();
while(rs.next()){
mark = "";
for(int i=0;i<numberOfColumns;i++){
if(rs.getString(i+1) != null){
temp = (rs.getString(i+1).trim());
}else{
temp="";
}
data[i] = new String(temp.getBytes("ISO-8859-1"), "GBK");
if (i!=(numberOfColumns-1)){
mark = mark + "?,";
}else{
mark = mark + "?";
}
}
String sql1 = "insert into "+SQL_TARGET_TABLENAME+" ( "+SQL_TABLE_FIELD+" ) values ( "+mark+" )";
PreparedStatement pstmt1 = conn_to.prepareStatement(sql1);
for(int i=0;i<numberOfColumns;i++){
pstmt1.setString(i+1,data[i]);
}
pstmt1.executeUpdate();
pstmt1.close();
}
conn.commit();
conn_to.commit();
System.out.println("**源与目的数据导出成功**");
}
}
/
第二,创建存储过程,带参数
create or replace procedure TransMetaData(p_str in varchar2)
as language java
name 'TransMetaData.donow(java.lang.String)';
/
注意:
1.如果第一步的java对象方法donow无参数,即为static donow()
则此处为create or replace procedure TransMetaData
as language java
name 'TransMetaData.donow()';
/
2.注意两个存储过程的不同,我们的参数在java代码里为String,
因此这里写java.lang.String.
3.如果需要有返回值,(java代码修改省略,返回double类型),则存储过程为
create or replace procedure TransMetaData(p_str in varchar2) return number
as language java
name 'TransMetaData.donow(java.lang.String) return double';
/
第三,执行存储过程
无参数:exec TransMetaData;
带参数:exec TransMetaData(1);
如果:通过pl/sql执行java代码时,在java代码里对数据库进行操作,出现类似如下错误:
ORA-29532: Java 调用被未捕获的 Java 例外终止:
java.security.AccessControlException: the Permission (java.net.SocketPermission
127.0.0.1:2002 connect,resolve) has not been granted to SINBOY. The PL/SQL to
grant this is dbms_java.grant_permission( 'SINBOY',
'SYS:java.net.SocketPermission', '127.0.0.1:2002', 'connect,resolve' )
ORA-06512: 在"SINBOY.TEST9", line 0
ORA-06512: 在"SINBOY.TRG", line 2
解决办法是:
yangwp
对os上的文件赋权限就可以了
grant javauserpriv to SINBOY;
Oracle 9i 角色列表
序号
角色
说明
1
AQ-ADMINISTRATOR-ROLE
队列管理员角色
2
AQ-USER-ROLE
队列用户角色
3
CONNECT
连接
4
CTXAPP
应用
5
DBA
数据库管理员
6
DELETE-CATALOG-ROLE
删除目录角色
7
EXECUTE-CATALOG-ROLE
执行目录角色
8
EXP-FULL-DATABASE
扩展整个数据库
9
GLOBAL_AQ_USER_ROLE
全局队列用户角色
10
HS-ADMIN-ROLE
HS管理角色
11
IMP-FULL-DATABASE
IMP全局数据库
12
JAVADEBUGPRIV
JAVA调试权限
13
JAVAIDPRIV
JAVA ID权限
14
JAVASYSPRIV
JAVA系统权限
15
JAVAUSERPRIV
JAVA用户权限
16
JAVA-ADMIN
JAVA管理员
17
JAVA-DEPLOY
JAVA调度
18
OEM-MONITOR
OEM遥控器
19
OLAP_DBA
联机分析数据库管理员
20
RECORVERY-CATALOG-OWNER
恢复目录所有者
21
RESOURCE
资源
22
SELECT-CATALOG-ROLE
选择目录角色
23
WKADMIN
WK管理员
24
WKUSER
WK用户
25
WM_ADMIN_ROLE
WK管理员角色
//-------------------------------附上一个自己写的简单的例子---------------------------------------
第一步:
create or replace JAVA SOURCE Named Js_Rand
AS
import java.util.Date;
public class showDate {
public static Date showNowDate(){
return new java.util.Date();
}
}
/
第二步.
CREATE OR REPLACE function rand return VARCHAR2
AS
language Java Name 'showDate.showNowDate() return Date';
/
第三步:
begin
dbms_output.put_line(rand);
End;
/
写的比较潦草,如果有不完善的地方,请指明,THANKS
- 关于pl/sql调用java的学习总结(附代码)
- 关于0racle中pl/sql调用java的实际应用(附代码)
- PL/SQL 调用JAVA 代码
- PL/SQL (关于oracle学习总结的说明)
- PL/SQL学习总结
- Oracle pl/sql学习总结
- 关于Oracle PL\SQL代码的wrapper与unwrapper
- jdbc的pl/sql的java调用存储过程
- pl/sql 有返回值的存储过程 java调用pl/sql过程 实例
- 在java中调用pl/sql编写的存储过程
- PL/SQL调用JAVA发布的Web Service示例
- 关于PL/SQL的使用
- 关于PL/SQL代码中的内嵌SQL与V$SQL的关系
- PL/SQL 调用Java程序(Linux)
- Java 调用PL/SQL Returning Object Array
- Java 调用PL/SQL Returning Object Array
- ORACLE触发器+PL/SQL调用JAVA方法
- Java 调用PL/SQL Returning Object Array
- Page.IsPostback 和 AutoPostback
- Html中,防止回车自动提交
- 十年编程经验凝结 与新人们分享
- 解决Struts中文乱码
- apache2+php5+mysql模块方式配置
- 关于pl/sql调用java的学习总结(附代码)
- Linux 创建文件系统及挂载文件系统流程详解
- 使用javamail 的一些问题
- 汉字区位码查询简单实现
- "表里俱澄澈"
- 什么叫涨停跌停
- 一个清华学生在香港读研受到的心灵震撼
- jbuilder 编辑器光标纠正-修改/jre/libfont.properties.zh
- 插入记录后获取ID