Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Groovy Oracle được lưu trữ Proc - chỉ mục cột ẩn

Đoạn mã sau có thể giúp bạn lấy biến của SYS_REFCURSOR từ khối ẩn danh Oracle.

Chúng ta nên tập trung vào một số chi tiết chính:

  1. Lớp groovy.sql.Sql không có OutParameter tương ứng và chúng tôi đặt nó theo cách thủ công là CURSOR_PARAMETER và chuyển nó tới sql.call phương pháp
  2. Hãy xem xét rằng khối bắt đầu bằng {call DECLARE và kết thúc bằng END } không có dấu chấm phẩy sau END. Nếu không, chúng tôi có thể nhận được SQLException kém nhận biết vào mặt.
  3. Các dấu chấm hỏi ? bên trong sqlString là nơi cho các ràng buộc tham số. Các ràng buộc được thực hiện theo thứ tự tự nhiên lấy các giá trị từ parametersList .
    • Trong ví dụ này, chúng tôi có liên kết duy nhất, vì vậy ? liên kết với CURSOR_PARAMETER coi giá trị là OUT tham số của kiểu đã truyền;
  4. Chỉ có một lần nhập để đóng sau sql.callResultSet rs cung cấp các hàng con trỏ my_cur được khai báo trong khối ẩn danh.
  5. Chúng tôi có thể đơn giản hóa sqlString bằng cách sử dụng một hàm trả về SYS_REFCURSOR bỏ sót một thủ tục với OUT tham số. Vì vậy, nó có thể giống như thế này "{call BEGIN ? := MY_FUNC(); END}" hoặc thậm chí "{? = call MY_FUNC()}"
import groovy.sql.OutParameter
import groovy.sql.Sql
import oracle.jdbc.OracleTypes

import java.sql.ResultSet

def driver = 'oracle.jdbc.driver.OracleDriver'
def sql = Sql.newInstance('jdbc:oracle:thin:@my-server:1521:XXX', 'usr', 'psw', driver)

// special OutParameter for cursor type
OutParameter CURSOR_PARAMETER = new OutParameter() {
    public int getType() {
        return OracleTypes.CURSOR;
    }
};

// look at some ceremonial wrappers around anonymous block
String sqlString = """{call
    DECLARE
      my_cur SYS_REFCURSOR;
    BEGIN
        STORED_PROCEDURE_NAME(my_cur);
        ? := my_cur;
    END
}
""";

// the order of elements matches the order of bindings
def parametersList = [CURSOR_PARAMETER];


// rs contains the result set of cursor my_cur
sql.call(sqlString, parametersList) { ResultSet rs ->
  while (rs.next()) {
      println rs.getString("my_column")
  }
};

P.S. Và cảm ơn bạn vì câu hỏi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. oracle đọc tên cột từ câu lệnh select

  2. SQL Tìm bản sao với một số trường (không có ID duy nhất)

  3. Đánh giá các biến boolean PL / SQL trong Oracle Forms

  4. Tạo chuỗi với BẮT ĐẦU VỚI từ Truy vấn

  5. So sánh hàng thứ n với hàng thứ n + 1 và nếu nó nằm trong phạm vi của hàng thứ n thì in n + 1 hàng USNG ORACLE QUERY