2009-10-19 70 views
8

Tôi có hàm trả về đối tượng có 3 giá trị. Có cách nào để gọi hàm đó từ một câu lệnh chọn và có mỗi giá trị là một cột khác không? Tôi có thể chia nó thành 3 chức năng, nhưng các giá trị có liên quan nên tôi muốn giữ nó như là một trong những lý do hiệu suất. (Vì vậy, oracle không phải gọi 3 chức năng phức tạp rất giống nhau cho mỗi dòng trong truy vấn.)Sử dụng loại đối tượng trong câu lệnh chọn trong Oracle

Vì vậy, đối:

create type test_obj is object ( 
a NUMBER, 
b NUMBER, 
c NUMBER); 

    create or replace function test_func (
    pinput NUMBER) 
    return test_obj 
    as 
    begin 
    return test_obj(0, 0, 0); 
    end test_func; 

Tôi muốn để có thể gọi test_func từ một tuyên bố chọn , nhưng có a, b và c là các cột khác nhau, mà không cần gọi hàm nhiều lần. Tôi nghĩ rằng có thể một cái gì đó như thế này, nhưng nó không hoạt động:

select 
    iv.col1, 
    iv.col2, 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     mt.col1, 
     mt.col2, 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

Có cách nào để làm bất cứ điều gì như thế này trong Oracle 10g, hoặc có cách nào tốt hơn để giải quyết vấn đề này?

Trả lời

9

Câu lệnh chọn trong câu hỏi sẽ hoạt động. Nó không thành công vì tôi không bao gồm bí danh cho chế độ xem nội tuyến.

Đối với một số lý do này sẽ làm việc:

select 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

Nhưng điều này sẽ không:

select 
    func_data.a, 
    func_data.b, 
    func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) 
+0

cảm ơn! điều này đã giúp tôi. – filiprem

+1

Vấn đề chỉ đơn giản là với độ phân giải tên. Oracle luôn diễn giải phần đầu tiên trước dấu chấm trong câu lệnh SELECT như một bí danh bảng hoặc một Từ đồng nghĩa/gói trong cơ sở dữ liệu. Nó cũng không kiểm tra tất cả các cột. Vì vậy, bạn phải hoàn toàn đủ điều kiện tên với table_alias.column.attribute – Falco

2

Các bí danh bảng đặt kết quả vào một kết quả có tên là thiết lập bối cảnh, cho phép kết quả làm việc như một thể hiện đối tượng. Nếu không có bí danh, nó không thành công vì quá trình truyền không xử lý các thể hiện kiểu đối tượng mà không có tham chiếu rõ ràng của riêng chúng, đó là những bí danh bảng có hiệu quả.

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