使用Java存储过程进行位运算
Oracle有理由不直接提供位 *** 作支持。由于Oracle提供了极为方便的Java存储过程,我们可以很方便的用来实现所有位 *** 作。
下面我们准备实现四种基本的位 *** 作。关于Java存储过程的内容,本文不给予太多描述,只引用必要的部分用于阐述问题。
首先,我们需要一个Java类,里面实现了位运算的四种基本功能。
public class BitOper {
public static int bitAnd(int a, int b) {
return a &b
}
public static int bitOr(int a, int b) {
return a | b
}
public static int bitXor(int a, int b) {
return a ^ b
}
public static int bitNot(int a) {
return ~a
}
}
为了便于描述问题,我将这个类设计的相当简单。
将其编译后得到BitOper.class。
接下来,使用Oracle提供的一个工具loadjava将上述类加载到数据库中。该工首银具在安装Oracle时已经自动安装。
loadjava –user user_name/password@sid BitOper.class
该命令执行完后,如果没有报错则表示加载成功。
最后一步工作是创建PL/SQL包装函数。这里有两种选择,一种是创建独立的函数,一种是创建用包封装的函数。为了减少篇幅,我选择使用第一种。
create or replace function bit_and
(
int1number,
int2number
) return number
DETERMINISTIC
AS LANGUAGE JAVA
NAME 'BitOper.bitAnd(int, int) return int'
/
create or replace function bit_or
(
int1number,
int2number
) return number
DETERMINISTIC
AS LANGUAGE JAVA
NAME 'BitOper.bitOr(int, int) return int'
/
create or replace function bit_xor
(
int1number,
int2number
) return number
DETERMINISTIC
AS LANGUAGE JAVA
NAME 'BitOper.bitXor(int, int) return int'
/
create or replace function bit_not
(
int1number
) return number
DETERMINISTIC
AS LANGUAGE JAVA
NAME 'BitOper.bitNot(int) return int'
/
将上述代码在SQLPLUS中执行后,当前用户就具备了四种基本位 *** 作的功能。
不妨使用几个例子来测试一者简宴下:
select bit_and(9,8) "9and8",
bit_or(3,4) "3or4",
bit_xor(3,5) "3xor5",
bit_not(3) "not3"
from dual
其结果为:
9and8 3or4 3xor5 not3
---------- ---------- ---------- ----------
8 7 6 -4
看起来一切都很简单,你是否这么认咐橡为呢?
一、前言:玩Oracle的人一般都是对电脑很内行的朋友,乎渗态如果不是, *** 作中会碰到很多困难。服务器上安装Oracle 10G或其后版本的Oracle。服务器上安装JAVA运行环境。在本地服务器上先进行实验,用最权高登录 *** 作系统权,用最高登录数据库的权。
二、具体方法:10G及其以后版本的Oracle数据库提供了对Java程序的更多的支持,可用调用JAVA的方法调用 *** 作系统命令。
1. 首先我们创建调用 *** 作系统命令的Java方法create or replace and compile java source named oscmd as
import java.io.*
import java.lang.*
public class OSCmd extends Object {
public static int OSCmd(String args) {
Runtime rt = Runtime.getRuntime()
int rc = -1
try {
Process p = rt.exec(args)
int bufSize = 4096
BufferedInputStream bis = new BufferedInputStream(p.getInputStream(), bufSize)
int len
byte buffer[] = new byte[bufSize]
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len)
rc = p.waitFor()
} catch (Exception e) {
e.printStackTrace()
rc = -1
} finally {
return rc
}
}
}
2. 然后,再创喊困建一个PL/SQL函数调岁源用Java方法
CREATE
OR REPLACE FUNCTION Run_Cmd(p_Cmd IN VARCHAR2) RETURN NUMBER AS
LANGUAGE JAVA NAME 'OSCmd.OSCmd(java.lang.String) return integer'
3. 之后我们就可以轻松的在Oracle程序中调用 *** 作系统命令了
declare
n number
begin
n := Run_Cmd('Copy C:\temp.txt D:\temp.txt')
end
三、补充说明:在Oracle的SQLPLUS下可以使用Host命令来执行 *** 作系统级别的命令或者可执行文件,PL SQL作为第三方远程联接工具,是不能直接执行这种指令的。
存储枣明过程是 PLSQL 的一个方面的应用,而 PLSQL 是存储过程的基础。即存储过程需要用到 PLSQL
创建无参存储过程 hello ,无返回值
语法:
删除存储 hello ,语法 drop procedure 过程名
调用存储过程方式一: exec 过程名
exec hello
调用过程存储方式二: PLSQL 程序
调用过程存储方式三: Java 程序 CallableStatement 接口
创建有存储过程的 raiseSalary (编号),为7369号员工涨工资10%,演示in的语法,大小写谈碰不敏感含岩谈
创建有参存储过程 findEmpNameAndSalAndJob (编号),查询7788号员工的姓名,职位,月薪,返回多个值,演示 out 的用法
用存储过程,写一个计算个人所得税的功能
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)