Как получить данные из базы данных оракула с помощью курсора? - PullRequest
0 голосов
/ 09 мая 2019
set serveroutput on;
CREATE OR REPLACE PROCEDURE invoice_report AS


orderDetail Orders%ROWTYPE;

CURSOR c_order IS 
    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='&order_no';


BEGIN
    Open c_order;
Loop
    FETCH c_order INTO orderDetail;
    EXIT WHEN c_order %NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(orderDetail);
END LOOP;
    Close c_order;
ENd;
/

Я новичок в PL / SQL, особенно используя курсор. Я хочу ВЫПОЛНИТЬ invoice_report, а затем отображать детали заказов клиентов после того, как они введут номер заказа. Затем отображается сообщение об ошибке: PLS-00394 неверное количество значений в списке INTO оператора FETCH.

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Если вы используете 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;
/
0 голосов
/ 09 мая 2019

Причина: Число переменных в предложении INTO оператора FETCH не соответствует количеству столбцов в объявлении курсора.

Решение: Измените количество переменных в предложении INTO или количество столбцов в объявлении курсора, чтобы числа совпадали.

CREATE OR REPLACE PROCEDURE invoice_report
AS


    CURSOR c_order
    IS
        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 = '&order_no';
    orderdetail   c_order%ROWTYPE;
BEGIN

    FOR orders IN orderdetail   
    LOOP
        DBMS_OUTPUT.PUT_LINE(orders.orderDetail);
    END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...