PLS-00103: Обнаружен символ «DBMS_OUTPUT» при ожидании одного из следующего: - PullRequest
0 голосов
/ 12 января 2020

При попытке запустить этот пакет я получил ошибку pl / sql. Как это решить, плз, помогите!

CREATE OR REPLACE PACKAGE  pkg_ref_value
     IS
        ref_value orders.total_order%TYPE;
        PROCEDURE proc_display_firstname( cust_id IN  customer.customer_id%TYPE);
        PROCEDURE proc_ref_value(orderId IN orders.order_id%TYPE);
   END pkg_ref_value;

   PROCEDURE proc_display_firstname( cust_id IN  customer.customer_id%TYPE) 
    IS
        cust_last_name VARCHAR2(20);
        CURSOR c1(cust_id customer.customer_id%TYPE ) IS 
            SELECT UPPER(CONCAT(CONCAT(cust_first_name,' '),cust_last_name)) FROM customer WHERE 
 customer_id=cust_id;
        BEGIN 
            OPEN c1(cust_id);
            LOOP
                FETCH c1 INTO cust_last_name;
                EXIT
                WHEN c1%NOTFOUND 
                    DBMS_OUTPUT.PUT_LINE(cust_last_name);// this is the place I got error
        END LOOP;
            CLOSE c1;
            EXCEPTION
         WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.PUT_LINE('NO DATA FOUND' );
    END proc_display_firstname;
    PROCEDURE proc_ref_value(orderId IN orders.order_id%TYPE)
    IS
        or_status orders.order_id%TYPE;
        total orders.total_order%TYPE;
        v_order_id orders.order_id%TYPE :=orders_id;

        CURSOR c2 (orderId orders.order_id%TYPE) IS 
SELECT 
    CASE 
    WHEN   order_status='refunded' THEN total_order*0.25
    WHEN   order_status='completed' THEN  total_order* 0
    WHEN   order_status='cancelled' THEN total_order*0
    END 
    FROM orders;

    BEGIN
        v_cust_last_name :=proc_display_firstname(v_order_id);
        SELECT order_id,order_status, total_order INTO v_order_id,or_status,total
        FROM orders
        WHERE order_id = v_order_id;


    OPEN c2(orderId);
    LOOP
        FETCH c2 INTO ref_value;
        EXIT WHEN c2%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(ref_value);
    END LOOP;
    CLOSE c2;
        DBMS_OUTPUT.PUT_LINE('cust name:'||v_cust_last_name||' Order Id'||v_order_id||'Order Status'||or_status||'Refund Value'||ref_value);
    END proc_ref_value;
END pkg_ref_value;'

1 Ответ

1 голос
/ 12 января 2020

Здесь есть несколько проблем:

  1. У вас есть оператор для создания пакета spe c (CREATE OR REPLACE PACKAGE), но вы пропустили оператор, необходимый для создания тела пакета (CREATE OR REPLACE PACKAGE BODY).

  2. Вы пропустили точку с запятой после EXIT WHEN c1%NOTFOUND.

  3. В v_order_id orders.order_id%TYPE :=orders_id; есть нет переменной с именем orders_id, которая находится в области видимости. Я подозреваю, что вы имели в виду orderId.

Обновленный код пакета показан ниже:

CREATE OR REPLACE PACKAGE pkg_ref_value IS
  ref_value orders.total_order%TYPE;

  PROCEDURE proc_display_firstname( cust_id IN  customer.customer_id%TYPE);
  PROCEDURE proc_ref_value(orderId IN orders.order_id%TYPE);
END pkg_ref_value;

CREATE OR REPLACE PACKAGE BODY pkg_ref_value IS  -- add
  PROCEDURE proc_display_firstname( cust_id IN  customer.customer_id%TYPE) IS
    cust_last_name VARCHAR2(20);

    CURSOR c1(cust_id customer.customer_id%TYPE ) IS 
      SELECT UPPER(CONCAT(CONCAT(cust_first_name,' '),cust_last_name))
        FROM customer
        WHERE customer_id=cust_id;
  BEGIN 
    OPEN c1(cust_id);

    LOOP
      FETCH c1 INTO cust_last_name;
      EXIT WHEN c1%NOTFOUND;  -- add ;
      DBMS_OUTPUT.PUT_LINE(cust_last_name);  --  this is the place I got error
    END LOOP;

    CLOSE c1;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('NO DATA FOUND' );
  END proc_display_firstname;

  PROCEDURE proc_ref_value(orderId IN orders.order_id%TYPE) IS
    or_status orders.order_id%TYPE;
    total orders.total_order%TYPE;
    v_order_id orders.order_id%TYPE := orderId;  -- changed from := orders_id

    CURSOR c2 (orderId orders.order_id%TYPE) IS 
      SELECT CASE 
               WHEN order_status='refunded'  THEN total_order*0.25
               WHEN order_status='completed' THEN total_order* 0
               WHEN order_status='cancelled' THEN total_order*0
             END 
        FROM orders;
  BEGIN
    v_cust_last_name := proc_display_firstname(v_order_id);

    SELECT order_id,order_status, total_order
      INTO v_order_id,or_status,total
      FROM orders
      WHERE order_id = v_order_id;

    OPEN c2(orderId);

    LOOP
      FETCH c2 INTO ref_value;
      EXIT WHEN c2%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(ref_value);
    END LOOP;

    CLOSE c2;

    DBMS_OUTPUT.PUT_LINE('cust name:' || v_cust_last_name || 
                         ' Order Id' || v_order_id ||
                         ' Order Status' || or_status ||
                         ' Refund Value' || ref_value);
  END proc_ref_value;
END pkg_ref_value;
...