2010-07-30 26 views
13

Tôi muốn trả lại các hàng từ một câu lệnh chọn trong một khối khai báo/bắt đầu/kết thúc. Tôi có thể làm điều này trong T-SQL nhưng tôi muốn biết làm thế nào để làm điều đó trong PL/SQL.Làm cách nào để trả về các hàng từ một khối khai báo/bắt đầu/kết thúc trong Oracle?

Mã này trông hơi giống như sau:

declare 
    blah number := 42; 
begin 
    select * 
    from x 
    where x.value = blah; 
end; 
+0

Bạn không thể retu dữ liệu rn từ khối PLSQL ẩn danh. –

+0

có, bạn có thể, ví dụ trong 'nút oracledb' bạn sử dụng' oracledb.BIND_OUT' kiểm tra https://github.com/oracle/node-oracledb/blob/master/doc/api.md – Toolkit

Trả lời

10

Một khối ẩn danh PL/SQL, giống như một bạn đã thể hiện, không thể "trở lại" bất cứ điều gì. Nó có thể tương tác với người gọi bằng các biến liên kết, tuy nhiên.

Vì vậy, phương pháp tôi sẽ sử dụng trong trường hợp này là khai báo tham chiếu con trỏ, mở nó trong khối PL/SQL cho truy vấn mong muốn và để ứng dụng gọi tìm nạp hàng từ nó. Trong SQLPlus, giao diện này sẽ trông giống như sau:

variable rc refcursor 

declare 
    blah number := 42; 
begin 
    open :rc for 
    select * 
    from x 
    where x.value = blah; 
end; 
/

print x 

Nếu bạn lấy lại PL/SQL làm hàm được lưu trữ thì nó có thể trả về giá trị. Trong trường hợp này những gì bạn có thể muốn làm là tạo ra một loại bộ sưu tập, lấy tất cả các hàng vào một biến kiểu đó, và gửi lại:

CREATE TYPE number_table AS TABLE OF NUMBER; 

CREATE FUNCTION get_blah_from_x (blah INTEGER) 
    RETURN number_table 
    IS 
    values number_table; 
    BEGIN 
    SELECT id 
     BULK COLLECT INTO values 
     FROM x 
     WHERE x.value = blah; 
    RETURN values; 
    END; 
/
+0

Cảm ơn - câu trả lời hay! Hiệu quả của việc sử dụng con trỏ trong trường hợp này là gì? Tôi luôn cố gắng tránh chúng vì hiệu suất kém của chúng trong T-SQL. –

+1

Con trỏ không có gì khác ngoài tham chiếu đến một kết quả. Hình phạt về hiệu suất xuất phát từ các vòng quay có liên quan giữa việc tìm nạp từng bản ghi. Tuy nhiên, mọi lựa chọn bạn gọi với Oracle sẽ được trả lại cho bạn dưới dạng một con trỏ. Trong. Net chúng được gọi là DataReaders. Khi bạn không có bất kỳ vấn đề về sự hoàn hảo nào với những vấn đề này, bạn sẽ không gặp phải vấn đề gì với con trỏ. –

0

Vâng, điều này phụ thuộc rất nhiều vào thư viện truy cập dữ liệu của bạn.

Bạn có thể trả về bất kỳ loại tương thích SQL nào làm tham số. Điều này bao gồm các loại SQL phức tạp và các loại bộ sưu tập. Nhưng hầu hết các thư viện chỉ đơn giản là không có khả năng xử lý các loại đối tượng của Oracle.

Dù bằng cách nào, ví dụ tôi sẽ sử dụng các loại đối tượng:

create type SomeType as object(Field1 VarChar(50)); 

create type SomeTypeList as table of SomeType; 

Khi thư viện truy cập của bạn có thể xử lý các loại đối tượng, bạn chỉ có thể trả về một danh sách các đối tượng PL/SQL:

begin 
    :list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c')); 
end; 

Nếu không, bạn có thể hack xung quanh nó bằng cách buộc danh sách này thành một lựa chọn và trả lại kết quả dưới dạng con trỏ:

declare 
    list SomeTypeList; 
begin 
    list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c')); 
    open :yourCursor for 
    SELECT A 
    FROM table(list); 
end; 
Các vấn đề liên quan