2017-05-04 3 views
0

Ich versuche, eine Körper PACKAGE in SQL zu erstellen, die 3 Prozeduren zum Hinzufügen eines Kunden, Entfernen eines Kunden und Auflisten aller Kunden enthält. Aber es gibt mir den Fehler ORA-24344.Apex Oracle Erfolg mit Kompilierungsfehler

Dies ist mein Code:

CREATE OR REPLACE PACKAGE BODY c_package AS 
--Adds a customer 
PROCEDURE addCustomer(c_id customers.id%type, 
c_name customers.name%type, 
c_age customers.age%type, 
c_addr customers.address%type, 
c_sal customers.salary%type) 
IS 
BEGIN 
    INSERT INTO customers(id,name,age,address,salary) 
    VALUES(c_id,c_name,c_age,c_addr,c_sal); 
END addCustomer; 

--Removes a customer 
PROCEDURE delCutomer(c_id customers.id%TYPE) IS 
BEGIN 
    DELETE FROM customers 
    WHERE id = c_id; 
END delCustomer; 

--Lists all customers 
PROCEDURE listCustomer IS 
CURSOR c_customers is 
    SELECT name FROM customers; 
TYPE c_list is TABLE OF customers.name%type; 
name_list c_list := c_list(); 
counter integer := 0; 
BEGIN 
    FOR n IN c_customers LOOP 
    counter := counter + 1; 
    name_list.extend; 
    name_list(counter) := n.name; 
    dbms_output.put_line('Customer(' ||counter||') '||name_list(counter)); 
    END LOOP; 
END listCustomer; 

END c_package; 
+0

Wenn yiou nicht den tatsächlichen Fehler auf andere Weise sehen können, fragen Sie die 'user_errors' Ansicht. Zwei Fehler, die herausspringen, sind, dass 'END addCustomers'' END addCustomer' sein sollte, und in dieser Einfügung haben Sie 'c_name' aus der values ​​-Klausel weggelassen. Es kann jedoch auch andere Probleme geben. Was ist der Punkt, um die 'c_list'-Sammlung zu füllen? –

+0

Danke! Ich versuche, verschiedene Arten der Programmierung in SQL zu lernen. Auch wenn ich den Code neu geschrieben habe, bleibt das Problem bestehen. – UnKn0wn27

+0

Der Name Ihrer zweiten Routine ist falsch geschrieben ('delCutomer'). – collapsar

Antwort

0

Das Problem war, dass das Verfahren in der Verpackung BODY beendet werden mußte, mit nur einem „END“ nicht „END procedure_name“.

Dies ist der richtige Code:

CREATE OR REPLACE PACKAGE BODY c_package AS 
--Adds a customer 
PROCEDURE addCustomer(c_id customers.id%type, 
c_name customers.name%type, 
c_age customers.age%type, 
c_addr customers.address%type, 
c_sal customers.salary%type) 
IS 
BEGIN 
    INSERT INTO customers(id,name,age,address,salary) 
    VALUES(c_id,c_name,c_age,c_addr,c_sal); 
END; 

--Removes a customer 
PROCEDURE delCutomer(c_id customers.id%TYPE) IS 
BEGIN 
    DELETE FROM customers 
    WHERE id = c_id; 
END; 

--Lists all customers 
PROCEDURE listCustomer IS 
CURSOR c_customers is 
    SELECT name FROM customers; 
TYPE c_list is TABLE OF customers.name%type; 
name_list c_list := c_list(); 
counter integer := 0; 
BEGIN 
    FOR n IN c_customers LOOP 
    counter := counter + 1; 
    name_list.extend; 
    name_list(counter) := n.name; 
    dbms_output.put_line('Customer(' ||counter||') '||name_list(counter)); 
    END LOOP; 
END; 

END c_package; 
+0

Das ist nicht korrekt. Die Verwendung von 'END procedure_name' ist in Ordnung und sogar vorzuziehen. Wie in Kommentaren zu Ihrer Frage angemerkt, muss der Name jedoch übereinstimmen. Sie haben die Frage aus irgendeinem Grund bearbeitet, um einige dieser Fehler zu entfernen. Dies wird jetzt kompiliert, aber Ihr Grund ist falsch, und Sie haben immer noch "delCutomer" anstelle von "delCustomer". –