有人提供一個問題:Trafodion的存儲過程是用Java實現的,既然如此,爲什麼要創建存儲過程,爲何不直接寫業務代碼實現,而是創建複雜的Trafodion存儲過程,Trafodion存儲過程的優點在哪裏?不能否認,因爲Trafodion目前還不支持PL/SQL(Trafodion企業版EsgynDB支持PL/SQL),創建存儲過程確實相對有點麻煩,須要編寫Java類,編碼打包上並上傳到每一個Trafodion安裝的節點。但說到Trafodion存儲過程的優點(準確地說,是存儲過程的優點,存儲過程不是Trafodion特有的),這裏我就要來講道說道了。java
何爲存儲過程?下面是摘自百度百科的一段話:sql
存儲過程(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 $MY_NODES -x $HOSTNAME mkdir $HOME/trafodion-spjs
pdcp $MY_NODES test.jar trafodion-spjs/
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.