Oracle 我们如何从pl/sql存储过程返回记录而不带参数

Oracle 我们如何从pl/sql存储过程返回记录而不带参数,oracle,stored-procedures,plsql,database-cursor,Oracle,Stored Procedures,Plsql,Database Cursor,我的问题是“如何从pl/sql存储过程返回多条记录而不带OUT参数”。我有这个疑问,因为如果我们在OUT参数中使用游标或refcursor,可能会降低性能。那么解决方案是什么呢???正如老程序员所写,我认为光标的性能不会是你的问题。但无论如何,这里有一个解决方案: 您可以返回自定义类型,如数字表。如果只是一个数字列表,您可以返回一个数字表。如果要从表中返回行,可以返回“tablename”%ROWTYPE的表。但我想您应该创建一些自定义类型 CREATE OR REPLACE TYPE PUWB

我的问题是“如何从pl/sql存储过程返回多条记录而不带OUT参数”。我有这个疑问,因为如果我们在OUT参数中使用游标或refcursor,可能会降低性能。那么解决方案是什么呢???

正如老程序员所写,我认为光标的性能不会是你的问题。但无论如何,这里有一个解决方案:

您可以返回自定义类型,如
数字表
。如果只是一个数字列表,您可以返回一个
数字表
。如果要从表中返回行,可以返回“tablename”%ROWTYPE的
表。但我想您应该创建一些自定义类型

CREATE OR REPLACE TYPE PUWB_INT.MyOrderType AS OBJECT
(
    OrderId NUMBER,
    OrderName VARCHAR2 (255)
)
/

CREATE OR REPLACE TYPE PUWB_INT.MyOrderListType AS TABLE OF MYORDERtype
/
现在我们可以像使用
returnmynumbervariable一样使用它们

让我们构建一个函数(过程没有返回值):

现在我们可以调用该函数并获得自定义类型的表:

DECLARE
    myOrderList   MyOrderListType;
    myOrder       MyOrderType;
BEGIN
    myOrderList := MyFunction ('test');

    FOR o IN myOrderList.FIRST .. myOrderList.LAST
    LOOP
        myOrder := myOrderList (o);
        DBMS_OUTPUT.put_line ('Id: ' || myOrder.OrderId || ', Name: ' || myOrder.OrderName);
    END LOOP;
END;

请注意,调用模式必须知道类型。

我想您可以填充一个数组,但这可能比游标的性能更差。您可以避免声明一个,但它仍然是一个游标。您有什么证据表明它会降低性能?这并不是真正返回任何内容,但是-您可以使用该存储过程填充某个表,然后-在其他地方(例如,在报告中)选择存储在该表中的数据。
DECLARE
    myOrderList   MyOrderListType;
    myOrder       MyOrderType;
BEGIN
    myOrderList := MyFunction ('test');

    FOR o IN myOrderList.FIRST .. myOrderList.LAST
    LOOP
        myOrder := myOrderList (o);
        DBMS_OUTPUT.put_line ('Id: ' || myOrder.OrderId || ', Name: ' || myOrder.OrderName);
    END LOOP;
END;