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

Cách gọi thủ tục có tham số ra làm kiểu bảng từ một lớp Java

Điều này không thể thực hiện được, hãy xem Truy cập PL / SQL Index-by Tables:

Oracle JDBC không hỗ trợ RAW, DATE và PL / SQL RECORD dưới dạng các loại phần tử.

Tôi có thể sẽ sử dụng kiểu đối tượng tùy chỉnh (toàn cầu, không phải gói) như vậy:

CREATE TYPE t_all_record AS OBJECT (
  x_object_type_id        number,
    x_object_name           varchar2(100),
    x_object_id             varchar2(70),
    x_audit_timestamp       timestamp(6),
    x_payload               clob
)
/
CREATE TYPE t_all_records IS TABLE OF t_all_record
/

tham chiếu bảng loại trong gói của bạn (t_all_records thay vì tt_all_tab) và điền vào nó như vậy

procedure get_data_Q1(x_object_id in varchar2 , x_all_type out t_all_records )
AS
begin
    SELECT t_all_record(O.object_type_id,O.object_name,O.object_id,A.audit_timestamp,P.payload)
    BULK COLLECT INTO x_all_type
    FROM APPLICATION APP, EXCEPTIONS E,MASTER_AUDIT A,MODULE_TYPE M,OBJECT_TYPE O,PAYLOAD P 
    WHERE ( A.MODULE_TYPE_ID = M.MODULE_TYPE_ID ) AND ( M.APPLICATION_ID = APP.APPLICATION_ID ) AND ( A.OBJECT_TYPE_ID = O.OBJECT_TYPE_ID ) AND ( O.OBJECT_ID = x_object_id )
end get_data_Q1;

Kết quả sẽ có thể sử dụng được từ java như vậy:

package tests.jdbc;

import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import java.sql.Struct;
import java.sql.Types;

import oracle.sql.StructDescriptor;

public class OracleTableOfResult {
    public static void main(String...a) throws Exception {
        Class.forName("oracle.jdbc.OracleDriver");
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:<USER>/<PASS>@<DATABASEHOST>:1521:<SERVICE>");

        final String typeName = "T_ALL_RECORD";
        final String typeTableName = "T_ALL_RECORDS";

        // Get a description of your type (Oracle specific)
        final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName.toUpperCase(), connection);        
        final ResultSetMetaData metaData = structDescriptor.getMetaData();

        // Call the procedure (or whatever else) that returns the table of a custom type
        CallableStatement cs = connection.prepareCall("{call ult_pkg.get_data_Q1(?, ?)}");
        cs.setString(1, "the_id");
        // Result is an java.sql.Array...
        cs.registerOutParameter(2, Types.ARRAY, typeTableName);     
        cs.execute();

        // ...who's elements are java.sql.Structs
        Object[] data = (Object[]) ((Array) cs.getObject(2)).getArray();
        for(Object tmp : data) {
            Struct row = (Struct) tmp;
            // Attributes are index 1 based...
            int idx = 1;
            for(Object attribute : row.getAttributes()) {               
                System.out.println(metaData.getColumnName(idx) + " = " + attribute);                                            
                ++idx;
            }
            System.out.println("---");
        }
        cs.close();     
        connection.close();
    }
}

Nhưng cuối cùng, thật đáng nghi vấn nếu bạn có thể sử dụng truy vấn của mình trong một câu lệnh sql đơn giản như một câu lệnh đã chuẩn bị sẵn…




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tính giá trị trung bình của một cột và sau đó đưa nó vào một truy vấn chọn trong oracle?

  2. Cách tạo một thủ tục bên trong một gói trong Oracle

  3. Chuyển đổi từ RAW của Oracle (16) sang GUID của .NET

  4. Làm cách nào để bạn thực thi SQL từ bên trong một tập lệnh bash?

  5. Trừ ngày trong Oracle - Kiểu dữ liệu số hoặc khoảng thời gian?