Oracle Cách print in dữ liệu ra console để fix bug

Trong lĩnh vực SQL Developer trên Oracle, ta thường xuyên phải lập trình với function hoặc procedure hoặc đơn giản chạy một script lệnh nào đó. Thỉnh thoảng ta sẽ gặp các bug mà không biết lỗi xử lý ở bước nào. Các nhanh nhất để tìm và fix các bug này là việc ghi log ra console hoặc ghi log vào một bảng nào đó để xem. Mình thì cách đơn giản nhất đó là ghi log ra console.

Rất may trên công cụ Toad for Oracle thì có tính năng DBMS Ouput để ta có thể đọc log mà mình viết bằng câu lệnh DBMS_OUTPUT.PUT_LINE(‘text’). Mặc định trên Toad thì tính năng này bị Disable để tối ưu công cụ. Để bật nó lên ta vào thanh menu ở phía dưới màn hình soạn thảo code, chọn đến tab DBMS Ouput và click vào nút màu đỏ phía dưới. Khi tính năng DBMS Ouput được bật ta sẽ thấy cái nút màu đỏ vừa rồi chuyển sang màu xanh lá cây. Tại đây ta có thể chọn thời gian Toad làm mới để lấy log ra, mặc định là 5s một lần.

Dưới đây là câu lệnh ghi log trong SQL:

var_log VARCHAR(100):= 'log'
DBMS_OUTPUT.PUT_LINE('I got here:'||var_log||' is the new value');

Tạo hàm mã hóa SHA-256 trên Oracle 11g R2 (hashing-with-sha-256-in-oracle-11g-r2)

Hàm băm SHA1 đã được công bố đã bị phá mà không phải bằng thuật toán vét cạn.
Tất cả các mã hóa toàn vẹn dữ liệu của mã SHA-1 cần phải chuyển đổi sang bộ mã hóa cao cấp hơn ví dụ hàm SHA-256.

Trong hệ thống của công ty mình hiện đang sử dụng SHA-1 để mã hóa thông tin trước khi gửi sang đối tác, vì vậy cần phải nâng cấp sang hàm băm SHA-256.
Hàm băm SHA-256 chỉ có sẵn từ bản Oracle 12c, bản Oracle 11g sẽ không có. Có 2 cách để có được hàm băm SHA-256:
Cách 1: Sử dụng thư viện của Java có sẵn trong JDK để tạo nên hàm SHA-256
Tham khảo tại địa chỉ: https://dzone.com/articles/hashing-with-sha-256-in-oracle-11g-r2
Nhưng ở địa chỉ này chạy sẽ không được procedure do phải tắt tính năng define của Orcle đi.
Các bước lần lượt như sau:

B1: Tắt chế độ define

set define off


B2: Tạo tài nguyên class Java trong Oracle:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED test."calcsha"
    AS import java.security.MessageDigest; 
 public class calcsha2 
     {
         static public String fncsha(String inputVal) throws Exception
         {           
             MessageDigest myDigest = MessageDigest.getInstance("SHA-256");        
             myDigest.update(inputVal.getBytes());
             byte[] dataBytes = myDigest.digest();
             StringBuffer sb = new StringBuffer();
             for (int i = 0; i < dataBytes.length; i++) {
              sb.append(Integer.toString((dataBytes[i])).substring(1));
             }        
             StringBuffer hexString = new StringBuffer();
             for (int i=0;i<dataBytes.length;i++) {
                 String hex=Integer.toHexString(0xff & dataBytes[i]);
                     if(hex.length()==1) hexString.append('0');
                     hexString.append(hex);
             }
             String retParam = hexString.toString();
             return retParam;           
         }    
     }

B3: Viết thủ tục để gọi đến tài nguyên trên:

CREATE OR REPLACE FUNCTION test.hash_sha256 (txt varchar2)
 RETURN VARCHAR2
 AS
 LANGUAGE JAVA
 NAME 'calcsha2.fncsha(java.lang.String) return String';

B4: Bật trả chế độ define

 set define on

B5: Test kết quả:

 select hash_sha256('123456789') from dual;



So sánh với kết quả online: https://passwordsgenerator.net/sha256-hash-generator/

Cách 2: Cách này viết mới luôn hàm SHA-256 bằng PL-SQL
Tham khảo tại: https://github.com/CruiserX/sha256_plsql

Ta cũng có thể test kết quả so với cách 1.

Trưởng nhóm mình yêu cầu làm cách 2. Theo bản thân mình thì nên làm cách 1 vì toàn bộ là sử dụng thư viện chung JAVA của toàn thế giới, phần code tường minh. Còn cách 2 thì đi copy trên mạng về chạy cảm giác không được an toàn lắm.

Cài đặt Flask và Flask-API trên Window offline

Để cài đặt Flask và Flask-API offline trên Window ta cần dowload đầy đủ các thư viện và cài đặt lần lượt như sau:
(Cách cài đặt Package Office như bài hướng dẫn: Cách cài đặt các package của python trên Window offline)

1: Werkzeug
2: MarkupSafe
3: pytz
4: Babel
5: Jinja2
6: itsdangerous
7: Click
8: Flask
9: Flask-API

Để tải các thành phần trên ta vào địa chỉ: https://pypi.org/ để tìm và tải tại mục: Download files.

Cài đặt: pip27.exe install ThePackageFile-0.0.0.tgz

Cài đặt các package của python trên Window offline

Server trên công ty mình không được kết nối Internet nên mọi thứ đều phải cài đặt offline. Cài đặt Python thì đơn giản, google thì có đầy.
Nhưng khi cài đặt một số package mở rộng thì trên mạng thường hưỡng dẫn cài đặt trực tiếp command thông qua lệnh PIP: pip install “gói cần cài đặt”
Ví dụ trực quan như cài đặt qua PIP trên: https://pypi.org/project/Jinja2/#description
Thì gõ lệnh: pip install Jinja2
Hệ thống sẽ tự động tải và cài đặt toàn bộ các thư viện cần thiết trước khi cài Jinja2 và cài Jinja2.

Bước 1: Nếu không có kết nối Internet trên server thì ta buộc phải cài đặt thủ công nhưng cũng thông qua trình PIP. Để có PIP thì ta tải phần mềm PIP theo đường dẫn sau và copy lên server (có cả phiên bản pip cho Python3 tại: https://github.com/phamkhactuy/python_I_learn):
https://github.com/phamkhactuy/python_I_learn/blob/master/pip2.7.exe

Bước 2: Để cài đặt một gói nào đó, ta đi tải gói đó về. Ví dụ ta muốn cài thư viện Flask thì ta vào địa chỉ https://pypi.org/project/Flask/ hoặc google để tìm. Ta vào phần Download để tải Source về(định dạng file được nén dạng .tar.gz). Để đơn giản ta đặt file này cùng thư mục với file pip2.7,exe đã tải về (Ví dụ tải được file: Flask-1.0.2.tar).

Bước 3: Tại thư mục này ta giữ phím Shift nhấn chuột phải và chọn: Open command window here hoặc dùng lệnh Cmd di chuyển đến thư mục chứa file.

Bước 4: gõ lệnh: pip27.exe install Flask-1.0.2.tar
Chờ một lát là hệ thống tự động cài đặt xong.

APEX 5.x Thiết lập mặc định báo cáo trong Interactive Report

Trong quá trình duy trì và phát triển thêm các tính năng báo cáo của công ty sử dụng công cụ Apex, mình cần phải chỉnh sửa một báo cáo sử dụng loại có tên là Interactive Reoport.
Người dùng muốn bổ sung thêm cột dữ liệu mới ẩn bớt cột đi theo nghiệp vụ. Trong phần Page Designer mình đã thêm cột thành công nhưng gặp 2 vấn đề:

  • Không thể nào đặt các cột mới theo đúng vị trí mà mình muốn, mặc dù trong phần Columns đã kéo thả để sắp xếp
  • Không biết cách làm sao để query báo cáo vẫn có nhưng mặc định báo cáo hiển thị không có, khi nào người dùng cần thì dùng tính năng Actions -> Select column để có thể hiển thị.

Để hiển thị mặc định đối với tất cả các người dùng theo một form nhất định như thứ tự các cột cần hiển thị, danh sách các cột ẩn, danh sách các cột hiển thị thì ta dùng cách sau:

B1: Đăng nhập bằng tài khoản admin
B2: Vào giao diện ứng dụng của người dùng đầu cuối. Trong thanh menu tìm kiếm tùy chỉnh của báo cáo. Click Actions và thực hiện các thay đổi theo báo cáo mình cần hiển thị:

  • Select columns: Sắp xếp, lựa chọn các cột cần hiển thị.
  • Filter: Đặt các điều kiện để lọc dữ liệu
  • Rows per page: Cấu hình số dòng trên 1 trang…

B3: Lưu lại cấu hình mặc định này bằng cách vào Actions -> Save Report.
Mục Save chọn: As Default Report Setting sau đó chọn Apply.

Done. Tất cả các User khi truy cập báo cáo này sẽ được mặc định hiển thị dữ liệu theo cách mà ta đã cài đặt.