Sybase SQL Studio 6.0.3程序员指南
2007-06-06 15:07:51 来源:WEB开发网为了对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的终端,你将看见输出。如果有任何异常,你也将看见栈跟踪。
所有这些似乎足够直观,但是我在简单的存储过程编程中的掩盖了巨大的烦恼,他们大多数确实应该提一提。
所有这些似乎足够直观,但是我在简单的存储过程编程中的掩盖了巨大的烦恼,他们大多数确实应该提一提。
不足
首先,Sybase Central慢地惊人。我猜想这是使用远程数据库API和Java造成的不可避免的后果之一,但是不提太痛苦了。也许Sybase能通过开发一个GTK、KDE或WxWindows版本的界面,才能更好地向Linux爱好者展示。
另一个问题是我只能通过在Sybase Central树状途中的asademo/Java Objects/Packages路径定位我登记的类,问题是几乎所有sun(故意用双关语)下面的Java类也出现在该表中,它与极慢的滚动一起,使得寻找一个特定类的要求变得难上加难。而且,自从你通过类图标的属性菜单将任何改动再装入到你的过程后,当开发并调试你的代码时,你可能必须多次进行这种搜索。侥幸的是,存储过程使用JDBC,因此围绕此问题还有一个好方法:给你的类增加main以允许他们成为远程应用的实用手段。这允许你在不得不在数据库登记他们而遇到麻烦前,用一个简单的编译/执行周期即可捕捉许多臭虫,但是这个解决办法有点奇特,考虑产品是一个数据库管理系统,并且DBMS应当帮助管理你的数据。Sybase并没有说它为解决提到的大量问题而正在研制过滤器。
至于ISQL,我发现,如果我改变了服务器端的代码,ISQL直到我重新连接到数据库才识别出变化。这实际上式一件好事-它保证正在运行的应用将不会突然发现他们的服务器端组件自行改动。但是它没被文档记录,并且我浪费了一些时间尝试弄明白为什么我的改变没被客户登记。我也发现了如果你在一个过程或函数使用错误的参数类型或数量,服务器将返回一个“过程没找到”的错误。我想这是因为他们使用一个乱名(name-mangling)技术以允许过程名字的多态性。但是这在数据库存储过程的上下文有些混乱。再者,后端好像不提供标准Java包装(wrapper)类作为参数的变换器(像Integer和Double那样),用如Integer或Double那样的原语,否则你将遇到“过程没找到”的错误。
但是一旦你熟悉它,使用Sybase SAS的Java存储过程是很容易的,要考虑到它是一种高级特性。
管理
Sybase提供很多基本的数据库管理工具用于安全性、网络连接、数据库复制、存储过程管理等。Sybase Central以树状结构提供存储过程和用户资料等的数据库信息。Sybase将它的复制代理移植到Linux,它允许DBA把数据库以高度定制的方法复制。然而,Sybase公司还没移植它的复制服务器到Linux平台(尽管它说工作正在进行)。如果你想为你的数据库提供ASE的全部动力,只有到这样的移植成形,否则你无法运行单独在一个不同的平台上运行ASE复制服务器(例如Solaris)。然后你能在Linux系统上运行实际的数据库,使用复制代理的Linux版本。注意那种低频、简单的复制也用SQL Remote管理而不必干扰一个单独数据库。
Sybase已经努力减少调节和管理企业级数据库管理系统的大部分复杂性。有一个内置的查询优化程序能从早先的询问学习以变得更聪明,动态优化而非要求很多秘传的数据库管理员的绝技,因为DBMS是公开的。最终目标是允许非数据库管理能有效地运用数据库。Sybase完成一部分这个值得称道的目标,甚至从版本6.0.3开始消除一些缺陷,例如,为一个使用-c选项启动的SQL服务器实例(instancs)调节缓存大小,过去一直很重要(一般到期望的数据库最大尺寸的大约20%)。也有必要使用-p选项增加网络包尺寸,现在这样的参数设置有更加智能化的默认值。
结论与一些工具
有很多Sybase第三方Linux程序。如果你希望使用ODBC,Openlink的ODBC驱动程序是一个好选择。Pathon用户可以结合像Marc-Andre Lemburg的mxODBC模块来访问Sybase,因为Python没有直接的捆绑。Tcl用户有点幸运:他们有Tom Poindexter的Sybtcl,它是Tcl的一个原生Sybase库。Scott Gray编写了SQSH,它是
一个很受欢迎的ISQL替换品,它设计成仿真典型的Unix外壳。Martin Mevald用PHP编写了一个简单的基于Web的查询接口。Walter Rawdanik最近提出了SybSQL,一个用Qt工具包编写的SQL编辑器,它用TDS协议连接Sybase ASE或Microsoft SQL Server。最后,有一个免费软件方案-FreeTDS,它创建一个库在报文级表格式数据流来访问Sybase。当Sybase没有一个Linux客户时,这显得更加关键,但是为了Sybase数据库写操作更有效,底层的工具仍然是好方法。微软的SQL Server,它从Sybase继承了TDS,所以也能使用 FreeTDS被访问,请参见附录资源连接。 有一件事情是相当清楚:Sybase for Linux必Oracle 8.0.5 for Linux或DB2 6.0 for Linux更容易安装、设置和管理。一般地讲,可亲近性(accessibility)使得Sybase更引起人们的注意,我向没有安装和维护方面顶尖数据库管理员经验的部门和组织推荐Sybase。Sybase服务器的Central确实仍然在可用性的方面需要一些工作。一个好即时Java编译器(just-in-time Jave compiler)也许能帮助改进其性能;但是 Sybase应该理会像在视图终提供过过滤器这样的细节。Sybase的可亲近性扩大到了它的编程接口,但是JDBC驱动程序中缺乏对CLOB、BLOB和数组的支持使人们怀疑Java组件的成熟程度,目前缺乏SQLJ也是如此。这不应该有什么担心,除了最高级Java数据库程序员,但是那些在痛苦边缘人们可能会考虑Oracle或 Db2跟多的Java特性。总之, Sybase的加入广受Linux世界的欢迎,它为可能不能幸运地雇用到企业数据库管理员的人提供企业数据库管理系统。
附录:参考文献
Sybase:
http://sybase.com/
Sybase SQLAnywhere:
http://sybase.com/products/anywhere/index.html
"Oracle on Linux," Uche Ogbuji (LinuxWorld, May 1999):
http://www.linuxworld.com/linuxworld/lw-1999-05/lw-05-oracle.html
The public Sybase NNTP server, with the forums sybase.public.sqlanywhere.linux and sybase.public.sqlserver.linux:
news://forums.sybase.com
The Blackdown JDK port:
http://www.blackdown.org
Linux ODBC drivers and connectivity software:
http://www.openlinksw.com/
Web-based query interface:
http://www.penguin.cz/~martinmv/websql/
Library for Sybase's wire-level protocol:
http://www.freetds.org/
Python ODBC library:
http://starship.skyport.net/~lemburg/mxODBC.html
Linux ISQL replacement:
http://www.voicenet.com/~gray/sqsh.html
Tcl Interface to Sybase:
http://www.nyx.net/~tpoindex/tcl.html#Sybtcl
Qt Sybase SQL Editor:
http://www.megsinet.net/~agatka/
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接