Если вы используете Oracle 12c и выше, просто используйте DBMS_SQL.RETURN_RESULT
с курсором REF
.Нет необходимости в циклах или dbms_output
.
Обратите внимание, что в теле процедуры не должно быть кода для получения ввода пользователя.Его можно передать в качестве аргумента.
set serveroutput on
CREATE OR REPLACE PROCEDURE invoice_report(p_orderno Orders.ono%TYPE) AS
c_order SYS_REFCURSOR;
BEGIN
OPEN c_order FOR
SELECT Orders.ono AS OrderNo,
Customer.cno AS CustomerNo,
Customer.cname AS CustomerName,
Orders.shipped AS OrderDate,
Part.pno AS PartNo,
Part.pname AS PartName,
OrderItem.qty AS Quantity,
Part.price AS Price
FROM Orders,Customer,Part,OrderItem where Orders.ono=p_orderno; --The argument
--Change it to explicit join syntax
DBMS_SQL.RETURN_RESULT(c_order);
END;
/
Теперь пользователь может передать значение во время выполнения.
BEGIN
invoice_report('&order_no');
END;
/