Tôi cố gắng để viết một số chức năng tổng hợp cho các varray và tôi nhận được mã lỗi này khi tôi đang cố gắng sử dụng nó với dữ liệu từ DB:Oracle Người dùng xác định chức năng tổng hợp cho varray của varchar
ORA-00600 internal error code, arguments: [kodpunp1], [], [], [], [], [], [], [], [], [], [], []
[koxsihread1], [0], [3989], [45778], [], [], [], [], [], [], [], []
Mã của hàm là thực sự đơn giản (trên thực tế nó không có gì):
create or replace
TYPE "TEST_VECTOR" as varray(10) of varchar(20)
ALTER TYPE "TEST_VECTOR" MODIFY LIMIT 4000 CASCADE
create or replace
type Test as object(
lastVector TEST_VECTOR,
STATIC FUNCTION ODCIAggregateInitialize(sctx in out Test) return number,
MEMBER FUNCTION ODCIAggregateIterate(self in out Test, value in TEST_VECTOR) return number,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT Test, ctx2 IN Test) return number,
MEMBER FUNCTION ODCIAggregateTerminate(self IN Test, returnValue OUT TEST_VECTOR, flags IN number) return number
);
create or replace
type body Test is
STATIC FUNCTION ODCIAggregateInitialize(sctx in out Test) return number is
begin
sctx := Test(TEST_VECTOR());
return ODCIConst.Success;
end;
MEMBER FUNCTION ODCIAggregateIterate(self in out Test, value in TEST_VECTOR) return number is
begin
self.lastVector := value;
return ODCIConst.Success;
end;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT Test, ctx2 IN Test) return number is
begin
return ODCIConst.Success;
end;
MEMBER FUNCTION ODCIAggregateTerminate(self IN Test, returnValue OUT TEST_VECTOR, flags IN number) return number is
begin
returnValue := self.lastVector;
return ODCIConst.Success;
end;
end;
create or replace
FUNCTION test_fn (input TEST_VECTOR) RETURN TEST_VECTOR
PARALLEL_ENABLE AGGREGATE USING Test;
Tiếp theo tôi tạo ra một số dữ liệu thử nghiệm:
create table t1_test_table(
t1_id number not null,
t1_value TEST_VECTOR not null,
Constraint PRIMARY_KEY_1 PRIMARY KEY (t1_id)
)
Bước tiếp theo là để đặt một số dữ liệu vào bảng
insert into t1_test_table (t1_id,t1_value) values (1,TEST_VECTOR('x','y','z'))
Bây giờ mọi thứ đều được chuẩn bị để thực hiện truy vấn:
Select test_fn(TEST_VECTOR('y','x')) from dual
Query trên cũng làm việc
Select test_fn(t1_value) from t1_test_table where t1_id = 1
Phiên bản của Oracle DBMS Tôi sử dụng : 11.2.0.3.0
Có ai đã thử làm một việc như vậy không? Tại sao bạn nghĩ nó không hoạt động?
ORA-600 -> đi tới bộ phận hỗ trợ của Oracle và tìm các bản sửa lỗi. Nếu bạn không tìm thấy, hãy gửi yêu cầu hỗ trợ. – Mat
Không cần phải tái phát minh ra bánh xe. Trong 11.2 bạn có [listagg] (http://docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm) và nếu bạn thực sự muốn một người dùng xác định một bản sao và dán [stragg Tom Kyte] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:2196162600402). – Ben
@Ben Trong thực tế, tôi không muốn nhận tất cả các kết quả từ nhóm. Tôi chỉ quan tâm đến một kết quả cụ thể (trên thực tế là kết quả mới nhất, được sắp xếp theo một cột). Có thể thực hiện nhờ chức năng 'Đầu tiên': Chọn column_name_2 aggregate_function (column_name) KEEP (DENSE_RANK LAST ORDER BY x) TỪ nhóm W theo column_name_2. Nó có thể được thực hiện cũng theo cách khác nhưng điều này tôi nghĩ là khá tốt. – baju