Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103118412
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Sybase

2008-04-10 20:19:24

  来源:qqread    作者:afiewqf

Java内幕

我在另一篇关于Oracle 8.0.5介绍中讨论过JDBC,在Sybase中使用JDBC十分类似(当然这是JDBC的主要目标之一)。然而,主要的数据库管理系统供应商在一个更专利的基础上一直在竞争的一个领域Java存储过程(JAVA stored procedure)。例如 PL/SQL 过程我在Oracle的文章有所论述,它允许用户创造能存储在数据库中的特定例程,与数据协作,这在客户端查询中允许更加成熟和定制特性。

Sybase支持传统的存储过程、程序存储模型和Transact-SQL方法,但是它也允许存储过程甚至使用JAVA重写的扩展类型。注意,Sybase确实至今还不允许对应于JAVA的SQLJ(SQLC对应C/C+)。Sybase的Java存储过程使用JDBC,并且是不比客户端的Java开发困难。

Sybase的Java存储过程仍不支持一些有用的JDBC数据类型,包括大二进制对象(BLOB)、大字符对象(CLOB )和数组。有希望的是,Sybase将不久支持这些,特别是CLOB对集中XML文件存储是非常有用的。

为了对Java存储过程有个印象,我写了下列代码:

import java.sql.*; // JDBC
import com.sybase.jdbc.*; // Sybase jConnect
import java.util.Properties; // Properties
import sybase.sql.*; // Sybase utilities

public class listing3{
    private static Connection conn; 

    public static int GetContactBuddy(Integer i){
 //This is where our result will go: default to 0
 String id = i.toString();
 int buddy_id = 0;
 try {
     //Stored Procedures use a special JDBC URI
     conn = DriverManager.getConnection("jdbc:default:connection");
     //Create a JDBC statement and make the query
     String qstr = "SELECT zip FROM contact WHERE id = " + id;
     Statement stmt = conn.createStatement();
     ResultSet results = stmt.executeQuery(qstr);
     int zip = 0;
     //Get the zip code, if we can
     if (results.next()){
  zip = results.getInt(1);
     }
     System.out.println(zip);
     if (zip != 0){
  //Now query a matching ID from the employee table
  Integer z = new Integer(zip);
  qstr = "SELECT emp_id FROM employee WHERE zip_code = " + z.toString();
  results = stmt.executeQuery(qstr);
  if (results.next()){
      buddy_id = results.getInt(1);
  }
     }
     System.out.println(buddy_id);
 }
 catch ( Exception e ) {
     System.out.println("Error: " + e.getMessage());
     e.printStackTrace();
 }
 //Return the employee ID, if we found one
 return buddy_id;
    }
}

增加一个存储过程或函数看起来很简单。你写出类并且导入(import)适当的包(package),然后简单地编写过程或函数,把这些过程或函数作为公共类的静态方法存储器来(对数据库存取使用JDBC)。在我们的例子中,我们定义函数GetContactBuddy,它取一个整数并且返回一个整数。

我使用了Sybase自带样品数据库,它包含雇员、部门和合同的表(table)。我小小的演示函数的想法是我们决定了在我们的公司实现一个伙伴系统,所有的合同都有一个基于地理位置雇员伙伴。基本上,我们用与邮政编码相同的合同号挑选雇员。Java函数帮助我们选择。如果你传来一个合同号,它将返回一个位于相同邮政编码的一个雇员标识符(如果有),当然如果没有,我就能用一个连接(join)从单独的查询得到结果:

select e.emp_id from employee e, contact c where e.zip_code = c.zip

但是那将是更加没趣。

为了使用该函数,我们必须首先编译它,将上面代码拷贝到listing3.java,并且运行命令:

$ javac listing3.java

另外,你需要JDK 1.1.x并在CLASSPATH中包括$SYBASE/java/asajdbc.zip。当然,上述命令生成

listing3.class。

现在,我们在样品数据库中登记它。通过Sybase Central我们很容易做到,在树状图中沿着asademo/Java Objects路径,点击Add Java Class或Jar图标。Java Wizard(Java向导)将询问你是否登记一个类或一个Java归档(jar),然后你指定类文件的路径,全部搞定。

你能通过标准SQL语句调用函数,运行ISQL并且进入命令窗口:

select listing3>>GetContactBuddy('7')

它被当作常规的SQL选择,从函数返回整数值。如果你正在使用样品数据库,回答应该是409。如果我们的类定义成一个过程(一个没有返回方法)。我们能这样调用它:

call java_class>>method_name(arguments)

你可能注意了Java代码中的打印语句,例如:

System.out.println(zip);

并且你可能一直想知道他们的输出在哪儿出现。存储过程将数据库引擎的stdout和stderr作为控制台,因此如果你到正在运行dbeng6的终端,你将看见输出。如果有任何异常,你也将看见栈跟踪。

所有这些似乎足够直观,但是我在简单的存储过程编程中的掩盖了巨大的烦恼,他们大多数确实应该提一提。

阅读(468) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~