第一,创建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
解决办法是:
权限不够
对os上的文件赋权限就可以了
grant javauserpriv to SINBOY;
附上刚找到的
Oracle 9i 角色列表
序号<o:p></o:p>
|
角色<o:p></o:p>
|
说明<o:p></o:p>
|
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;
/
多谢指导
相关推荐
作 者:钱慎一,张素智 编 出 版 社:中国水利水电出版社 ISBN:9787508468303 出版时间:2009-09-01 版 次:1 页 数:468 装 帧:平装 ...附录A 0racle 11g词汇集锦 附录B 0facle 11g选件概述
作 者:钱慎一,张素智 编 出 版 社:中国水利水电出版社 ISBN:9787508468303 出版时间:2009-09-01 版 次:1 页 数:468 装 帧:平装 ...附录A 0racle 11g词汇集锦 附录B 0facle 11g选件概述
结合开发应用Oracle数据库的实践经验编撰而成的,书中编排的内容次序非常适合于读者学习和把握Oracle的脉络,书中所选择的问题都是在实际开发应用Oracle过程中经常遇到和所要解决的。通过学习解决这些问题的方法,...
4. **存储过程和函数(PROCEDURES AND FUNCTIONS)**:编写和调用PL/SQL代码块,实现更复杂的数据处理逻辑。 5. **触发器(TRIGGERS)**:自动执行的程序,通常在数据修改事件(INSERT, UPDATE, DELETE)时触发。 ...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,尤其在企业级应用中占据重要地位。这份“Oracle数据库大学课件”提供了全面的学习资源,适合初学者和希望深化理解Oracle技术的人群。以下是对课件中可能包含...