2012-09-02 28 views
9

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?

+4

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

+3

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

+0

@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

Trả lời

-4

"Mã lỗi nội bộ ORA-00600, đối số:", Nó cho biết một số khối bị hỏng nội bộ cố gắng khôi phục vùng bảng hệ thống và vùng bảng người dùng cụ thể.

+5

-1 Câu trả lời này sẽ không giúp giải quyết vấn đề này và là lời khuyên xấu nói chung. Vấn đề có thể được sao chép với dữ liệu mẫu được cung cấp, không có khối bị hỏng. ORA-00600 chỉ có nghĩa là một lỗi Oracle, nó không nhất thiết có nghĩa là bất cứ điều gì là sai với dữ liệu. –

+1

ORA-00600 là mã chung của Oracle cho các ngoại lệ nội bộ chưa được xử lý, tức là các lỗi. Khối bị hỏng là một trong những nguồn có thể có của các lỗi ORA-00600, nhưng có nhiều lỗi khác. Các đối số cho biết nguyên nhân cụ thể. Hành động được khuyên là gọi cho Oracle Support, vì giải pháp có thể yêu cầu một bản vá. – APC

0

Như đã lưu ý, ORA-00600 là lỗi nội bộ của Oracle. Không có vần điệu hay lý do nào cho họ và bản sửa lỗi thực sự duy nhất là lấy một bản vá từ Oracle.

Tuy nhiên ... tất cả đã nói ... thường có thể tinh chỉnh mã của bạn một chút để tránh lỗi.

Trong trường hợp của bạn, bạn có thể làm điều này:

Select test_fn(cast(t1_value as test_vector)) 
from t1_test_table 
where t1_id = 1; 

Đó là, rõ ràng đúc cột như test_vector trước khi đi qua nó để tổng hợp ODCI của bạn.

Tính năng này hoạt động ở 12c. (Và, trong 12c, bạn sẽ nhận được ORA-00600 mà không cần sửa lỗi này).

Các vấn đề liên quan