Параметр процедуры определяет параметр вложенной процедуры. - PullRequest
0 голосов
/ 07 июня 2018

Я хочу написать процедуру, которая берет номер счета-фактуры, а затем выводит информацию о клиенте, который купил этот конкретный продукт.

У меня есть процедура, которая отображает детали клиента, используя идентификационный номерв качестве параметра, и это прекрасно работает!

Я не знаю, как использовать номер счета для определения значения идентификатора для клиентской процедуры.

Использую Oracle, sql plus

Код:

Информация о клиенте:

SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE custdets (in_number IN customers.c_ID%TYPE)
IS
    CURSOR customer_cursor
    IS
        SELECT c_ID,
               C_PH,
               c_FName,
               c_LName,
               c_address1,
               c_address2,
               c_address3
          FROM customers
         WHERE in_number = c_id;

    crow   customer_cursor%ROWTYPE;
BEGIN
    FOR crow IN customer_cursor
    LOOP
        DBMS_OUTPUT.PUT_LINE ('Customer Details');
        DBMS_OUTPUT.PUT_LINE (
            'CUST ID#: ' || crow.c_id || CHR (9) || 'PH: ' || crow.c_ph);
        DBMS_OUTPUT.PUT_LINE (
            'Customer Name: ' || crow.c_Fname || ',' || crow.c_Lname);
        DBMS_OUTPUT.PUT_LINE (
               'Address: '
            || crow.c_address1
            || ','
            || crow.c_address2
            || ','
            || crow.c_address3);
    END LOOP;
EXCEPTION
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
/

Текущий запрос:

CREATE OR REPLACE PROCEDURE SalePurchase(in_invoice IN sales_purchases.sp_invoice%TYPE)
IS                      
BEGIN                     
    DBMS_OUTPUT.PUT_LINE('###########################################');
    DBMS_OUTPUT.PUT_LINE('# P U R H A S E - S A L E - S U M M A R Y #');
    DBMS_OUTPUT.PUT_LINE('#         INVOICE NO: ' || in_invoice || '           #');
    DBMS_OUTPUT.PUT_LINE(chr(13)); 
    DBMS_OUTPUT.PUT_LINE('###########################################');
    DBMS_OUTPUT.PUT_LINE(CHR(13));
    DBMS_OUTPUT.PUT_LINE('############################################');
    custdets();
end;
/

Заранее спасибо!

Редактировать:

Разработано, что, когда я помещаю идентификационный номер в процедуру, которую я хочу вызвать, например, custdets (4), он распечатывает клиента с идентификатором этого номера.Это независимо от того, сделали ли они покупку или нет.

1 Ответ

0 голосов
/ 07 июня 2018

Invoice number должен быть первичным ключом, я не знаю, таблицы с именем INVOICES, может быть?Это ваша схема, вы знаете это лучше, чем мы.В любом случае, эта таблица должна иметь столбец с именем C_ID или, возможно, customer_id, который является идентификатором клиента, которому выставлен счет;этот столбец является внешним ключом для таблицы CUSTOMERS.

Итак, ваша новая процедура должна принять ID счета в качестве параметра.Используйте это значение для поиска записи INVOICES.Это даст вам C_ID для перехода к существующей процедуре custdets() и отображения информации о клиенте.

"Они оба находятся в одной таблице, как передать это custdets ()"

Примерно так:

CREATE OR REPLACE PROCEDURE SalePurchase(
      in_invoice IN sales_purchases.sp_invoice%TYPE)
IS          
    l_customer_id  sales_purchases.c_id%type;           
BEGIN  
    select c_id into l_customer_id
    from sales_purchases
    where sp_invoice = in_invoice;
    custdets(l_customer_id);
END;
...