intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Xử lý dữ liệu bằng Java trong Oracle

Chia sẻ: Hoang Nhan | Ngày: | Loại File: PDF | Số trang:7

343
lượt xem
67
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Oracle luôn là một công cụ hay ứng dụng tốt nhất để xử lý dữ liệu? Câu trả lời nằm ở bên trong những gì bạn thực hiện. Thông thường, dữ liệu được biến đổi thông qua ngôn ngữ xử lý dữ liệu, ngoài ra nó cũng có thể được biến đổi thông qua việc xử lý các chuỗi hoặc số.

Chủ đề:
Lưu

Nội dung Text: Xử lý dữ liệu bằng Java trong Oracle

  1. Xử lý dữ liệu bằng Java trong Oracle Nguồn : quantrimang.com  Oracle luôn là một công cụ hay ứng dụng tốt nhất để xử lý dữ liệu? Câu trả lời nằm ở bên trong những gì bạn thực hiện. Thông thường, dữ liệu được biến đổi thông qua ngôn ngữ xử lý dữ liệu, ngoài ra nó cũng có thể được biến đổi thông qua việc xử lý các chuỗi hoặc số. Để phân biệt giữa các loại xử lý này, hãy cho rằng dữ liệu được lưu trữ trong phạm vi DML, đầu ra hoặc dữ liệu hiển thị là những gì hoặc bằng cách nào dữ liệu lưu được hiển thị cho người dùng. Một ví dụ đơn giản cho trường hợp này là ngày tháng. Những gì được lưu có thể được yêu cầu để hiển thị theo những cách khác nhau. Ví dụ như là March 8th, 2007 cũng như 03/08/2007; nó phụ thuộc vào những gì mà bạn hoặc người dùng của bạn muốn nhìn thấy như thế nào. Tiêu điểm chính của bài viết này liên quan đến bằng cách nào bạn có thể lấy được từ những thứ được lưu để hiển thị nó như thế nào đó. Tiêu điểm này liên quan đến những vấn đề xử lý xung quanh một chuỗi hay một số nào đó. Cho rằng bạn có một ứng dụng hỗ trợ các thống kê hoặc cung cấp phiếu cho người dùng thông qua Internet. Việc kích chuột để đệ trình trong một biểu mẫu thống kê trực tuyến, thống kê theo ID hoặc theo số tài khoản, để được qua như một trong những cặp giá trị - tên trong một URL, đây là một vấn đề thường được thực hiện trong các bộ nhận dạng của bạn. Trường hợp sử dụng khác cho cơ chế truyền tải “truyền dữ liệu trở lại” này dùng để hợp lệ hoặc giới hạn sự sử dụng của bạn. Các phiếu, dù trong biểu mẫu bằng giấy hoặc điện tử đều được biểu hiện bằng những định dạng số. Các số rất lớn làm cho chúng trở lên khó khăn hơn đối với việc làm giả mạo khi mà mật độ của nó được giãn cách nhiều hơn. Mặc dù vậy vấn đề ở đây là việc truyền trở lại số mã vạch 22 con số chẳng hạn sẽ tiêu tốn đến không gian hay chiều dài trong URL (giới hạn 255 hoặc 256 kí tự). Những gì cần thiết ở đây là cách làm ngắn một số lớn trở thành một số nhỏ hơn. Một phương pháp để giải quyết vấn đề trên là lấy những số trong hệ cơ số 10 và biến đổi chúng thành các số trong hệ cơ số 36, bằng cách đó bạn có thể tiết kiệm được khoảng trống. Trong Oracle, bạn sẽ thực hiện điều đó như thế nào? Phương pháp PL/SQL Hãy xem xét phương pháp PL/SQL. Mã được tối ưu hóa thành bit, trong đó thừa số có một bước nhảy dưới dạng vị trí hoặc tính lặp đi lặp lại đã sử dụng trong các tài khoản. Nó cũng dựa vào đầu vào hiện nay với tối thiểu chiều dài 22 chữ
  2. s ố. CREATE OR REPLACE FUNCTION gen_barcode36 (i_coupon_number NUMBER) RETURN VARCHAR2 IS v_number number; v_curval number; v_curinc number := power(36,14); v_true number := 0 ; v_pos number := 15; v_dec_count number := 0 ; v_pos_val number := 0 ; v_cur_num number := 0 ; v_test_num number := 0 ; v_new_num number := 0 ; v_cur_digit char := ''; v_new_val varchar2(15) := ''; BEGIN v_number := i_coupon_number; while ( v_true = 0 ) loop v_curinc := v_curinc * 36; v_curval := v_number / v_curinc; if ( v_curval < 1 ) then v_true := 1; else v_pos := v_pos + 1; end if; end loop; v_dec_count := v_pos; v_new_val := NULL; v_cur_num := v_number; WHILE ( v_dec_count > 0) LOOP v_pos_val := power(36,v_dec_count - 1); v_test_num := trunc(v_cur_num/v_pos_val); select decode(v_test_num,35,'z', 34,'y', 33,'x', 32,'w', 31,'v', 30,'u', 29,'t', 28,'s', 27,'r', 26,'q', 25,'p', 24,'o', 23,'n', 22,'m', 21,'l', 20,'k', 19,'j', 18,'i', 17,'h', 16,'g', 15,'f', 14,'e', 13,'d', 12,'c', 11,'b', 10,'a', 9,'9', 8,'8', 7,'7', 6,'6',
  3. 5,'5', 4,'4', 3,'3', 2,'2', 1,'1', '0') INTO v_cur_digit FROM DUAL; IF ( v_new_val IS NOT NULL ) THEN v_new_val := v_new_val || v_cur_digit; ELSE v_new_val := v_cur_digit; END IF; v_cur_num := v_cur_num - (v_pos_val * v_test_num); v_dec_count := v_dec_count - 1; END LOOP; RETURN v_new_val; END gen_barcode36; / Một phiên bản khác của phương pháp này có đầu ra đính kèm với nó vì vậy bạn có thể thấy được các số được giảm như thế nào. SQL> select gen_barcode36(7700000000000000000000) from dual; GEN_BARCODE36(7700000000000000000000) ----------------------------------------------------- 1950zn8fqxjygow Starting with 7700000000000000000000 Position: 6140942214464815497216 current number: 1 Position 14 current value: 1 Position: 170581728179578208256 current number: 9 Position 13 current value: 19 Position: 4738381338321616896 current number: 5 Position 12 current value: 195 Position: 131621703842267136 current number: 0 Position 11 current value: 1950 Position: 3656158440062976 current number: 35 Position 10 current value: 1950z Position: 101559956668416 current number: 23 Position 9 current value: 1950zn Position: 2821109907456 current number: 8 Position 8 current value: 1950zn8 Position: 78364164096 current number: 15 Position 7 current value: 1950zn8f Position: 2176782336 current number: 26 Position 6 current value: 1950zn8fq Position: 60466176 current number: 33 Position 5 current value: 1950zn8fqx
  4. Position: 1679616 current number: 19 Position 4 current value: 1950zn8fqxj Position: 46656 current number: 34 Position 3 current value: 1950zn8fqxjy Position: 1296 current number: 16 Position 2 current value: 1950zn8fqxjyg Position: 36 current number: 24 Position 1 current value: 1950zn8fqxjygo Position: 1 current number: 32 Position 0 current value: 1950zn8fqxjygow Final value: 1950zn8fqxjygow Điều đó không có nghĩa là bảo mật thông qua tình trạng ít người biết đến. Mặc dù vậy, một chuỗi lạ sẽ làm khó hầu hết người dùng muốn tính toán những gì hiển thị. Nếu tính đến một giá trị thì hiệu suất xử lý dữ liệu là “OK”, nhưng sẽ mất bao lâu nếu tạo ra một triệu giá trị? Hãy tạo một bảng có 3 cột. Cột đầu tiên là cột cơ số 10, cột thứ hai là giá trị đã được xử lý cơ số 36 bằng sử dụng mã PL/SQL Server ở trên và cột thứ ba được dành riêng cho đầu ra bằng sử dụng một nghĩa khác để biến đổi các số. Tạo một bảng và đưa vào đó một triệu bản ghi. Điều chỉnh thời gian để xem nó sẽ mất bao nhiêu thời gian để tạo ra các giá trị cơ số 36 này. SQL> create table base36 2 (barcode number, 3 plsql_ver varchar2(15), 4 other_ver varchar2(15)); Table created. SQL> create sequence barcode_seq start with 7700000000000000000000; Sequence created. SQL> begin 2 for i in 1..1000000 loop 3 insert into base36 (barcode) values (barcode_seq.nextval); 4 end loop; 5 end; 6/ PL/SQL procedure successfully completed. SQL> commit; Commit complete.
  5. SQL> set timing on SQL> update base36 set plsql_ver = gen_barcode36(barcode); 1000000 rows updated. Elapsed: 00:33:09.01 Tốc độ làm việc đến trên 500 bản/s Đây có thể có một cách nhanh của PLATFORM/SQL để thực hiện nhiệm vụ này? Vấn đề này là một ví dụ tốt như khi ta sử dụng ngôn ngữ tốt hơn trong giao tiếp, còn PL/SQL thực hiện biến đổi dữ liệu. Một phương pháp tốt trong trường hợp này sẽ được dùng để xử lý chuỗi bằng Java và một phương pháp khác kèm theo (cho chuỗi). Làm thế nào để đưa mã Java vào cơ sở dữ liệu? Đầu tiên, chúng ta cần phải có một file Java có mã thích hợp trong đó. Thứ hai là để upload mã (nguồn hoặc phiên bản đã biên dịch) vào cơ sở dữ liệu. Thứ ba là biên dịch mã, và sau đó bước cuối cùng là tạo một chức năng bao bọc hoặc thủ tục xung quanh mã Java. Chức năng đó được gọi là đối tượng tên Oracle, nó sẽ gọi đối tượng tên Java. Mã nguồn. import java.math.BigInteger; import java.lang.String; public class BCUtils { public static String getBarcode36(String barcode10) { String value = new String(barcode10); BigInteger bigI = new BigInteger(value.toString()); StringBuffer result = new StringBuffer(bigI.toString(36)); return result.toString(); } } Tải file nguồn và biên dịch nó.
  6. Tạo chức năng bao bọc/ công bố lớp SQL> create or replace function get_bc36(bc_10 varchar2) 2 return varchar2 3 as language java name 4 'BCUtils.getBarcode36(java.lang.String) return java.lang.String'; 5/ Function created. Kiểm tra sự khác nhau SQL> update base36 set other_ver = get_bc36(barcode); 1000000 rows updated. Elapsed: 00:13:56.22 Tốc độ làm việc đạt tới 1200/s, nhanh gấp hơn hai lần so với phiên bản PLATFORM/SQL. Tại sao lại như vậy? Oracle thừa nhận rằng PL/SQL không phải là ngôn ngữ nhanh nhất trên thế giới hoặc tốt nhất cho xử lý chuỗi. Danh sách các bước quan trọng được giới thiệu trong phần có tiêu đề “Java Stored Procedure Steps” trong hướng dẫn của Java Developer. Kết luận PL/SQL có thể thực hiện nhiều thứ tốt, nhưng các ngôn ngữ khác có thể thực hiện tốt hơn nhiều. Điều đó có thể được kiểm chứng dưới dạng đo tốc độ. Nếu bạn thấy rằng dữ liệu được lưu phải được xử lý để hiển thị ở đầu ra thì nên chọn
  7. một ngôn ngữ khác để hỗ trợ ví dụ như Oracle chẳng hạn.  
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2