有人提供一个问题:Trafodion的存储过程是用Java实现的,既然如此,为何要建立存储过程,为什么不直接写业务代码实现,而是建立复杂的Trafodion存储过程,Trafodion存储过程的优势在哪里?不可否认,由于Trafodion目前还不支持PL/SQL(Trafodion企业版EsgynDB支持PL/SQL),建立存储过程确实相对有点麻烦,需要编写Java类,编码打包上并上传到每个Trafodion安装的节点。但说到Trafodion存储过程的优势(准确地说,是存储过程的优势,存储过程不是Trafodion特有的),这里我就要来说道说道了。

何为存储过程?下面是摘自百度百科的一段话:

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

存储过程的优势?

1.模块化设计:将多个复杂SQL语句封装在一起,一次创建,调用多次,可减少开发人员工作量

2.执行更快:存储过程只在创建时编译,以后每次执行都无需重新编译,而一般SQL语句是执行一次编译一次

3.安全性高:可以基于角色授权,指定某些用户才可以执行存储过程

4.减少网络传输:存储过程是运行于服务器上,数据访问都是在服务器上执行,减少了与客户端进行大数据量的传输

下面通过一个例子简单介绍如何创建并使用Trafodion SPJ。主要步骤如下:

1.编写Java文件

import java.sql.*;
import java.math.*;
 
public class test
{
  public static void adjCredit(String name, String[] newCredit) throws SQLException {
 
     Connection conn = DriverManager.getConnection("jdbc:default:connection");
 
     PreparedStatement updateCredit = conn.prepareStatement("update trafodion.sales.customer " +
                                    "set credit = 'A2' " +
                                 "where custname = ?");
 
     PreparedStatement getCredit = conn.prepareStatement("select credit " +
                                "from trafodion.sales.customer " +
                                "where custname = ?");
 
     updateCredit.setString(1, name);
 
     updateCredit.executeUpdate();
 
     getCredit.setString(1, name);
 
     ResultSet rs = getCredit.executeQuery();
     rs.next();
 
     newCredit[0] = rs.getString(1);
 
     rs.close();
     conn.close();
  }
}

2.编译1中的java文件生成class文件

[trafodion@cent-1 ~]$ javac test.java
[trafodion@cent-1 ~]$ ls -la test.*
-rw-rw-r--. 1 trafodion trafodion 1113 Oct  9 09:21 test.class
-rw-rw-r--. 1 trafodion trafodion  823 Oct  9 09:21 test.java 

3.打包2中的class文件

[trafodion@cent-1 ~]$ jar cvf test.jar test.class
added manifest
adding: test.class(in = 1113) (out= 642)(deflated 42%)
[trafodion@cent-1 ~]$ ls -la test.*
-rw-rw-r--. 1 trafodion trafodion 1113 Oct  9 09:21 test.class
-rw-rw-r--. 1 trafodion trafodion 1095 Oct  9 09:21 test.jar
-rw-rw-r--. 1 trafodion trafodion  823 Oct  9 09:21 test.java

4.发布3中的jar文件

  • 使用pdsh命令在每个节点上创建相同的目录
pdsh $MY_NODES -x $HOSTNAME mkdir $HOME/trafodion-spjs

  • 使用pdcp把前面生成的jar复制到每个节点的相同目录下
pdcp $MY_NODES test.jar  trafodion-spjs/
  • 创建library指向上述jar路径
SQL>create library trafodion.sales.sales file '/home/trafodion/trafodion-spjs/test.jar';
 
--- SQL operation complete.
 
SQL>get libraries;
 
--- SQL operation complete.
 
SQL>get libraries in schema trafodion.sales;
 
SALES
 
--- SQL operation complete.

5.创建SPJ

SQL>create procedure trafodion.sales.adjCredit(in name varchar(10),out credit varchar(10))
+>external name 'test.adjCredit'
+>library trafodion.sales.sales
+>language java
+>parameter style java;
 
--- SQL operation complete.
 
SQL>get procedures;
 
Procedures in Schema TRAFODION.SALES
====================================
 
ADJCREDIT

6.执行SPJ

SQL>call adjcredit('A',?);
....
 
CREDIT
----------
A2
 
--- SQL operation complete.


EsgynChina
12 声望11 粉丝

易鲸捷公司项目总监


引用和评论

0 条评论