2017-05-04 3 views
0

고객을 추가하고 고객을 삭제하고 모든 고객을 나열하는 3 가지 절차가 포함 된 SQL의 본문 패키지를 만들려고합니다. 그러나 그것은 나에게 ORA-24344 에러를 준다.컴파일 오류가있는 Apex 오라클 성공

이 내 코드입니다 :

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

:

이 올바른 코드입니다. 두 가지 실수는'END addCustomers'가'END addCustomer'이어야하고, 그 삽입에서 values ​​절에서'c_name'을 생략했다는 것입니다. 그래도 다른 문제가있을 수 있습니다. 'c_list' 콜렉션을 채우는 지점은 무엇입니까? –

+0

감사합니다. 나는 SQL에서 프로그래밍의 다른 방법을 배우려고 노력하고있다. 또한 코드를 다시 작성했지만 문제는 여전히 남아 있습니다. – UnKn0wn27

+0

두 번째 루틴의 이름이 잘못되었습니다 ('delCutomer'). – collapsar

답변

0

문제는 패키지 본체 내부의 절차는 단지 "END"없습니다 "END의 PROCEDURE_NAME"로 종료되어야했다이었다. yiou 실제 오류를 다른 방법으로 볼 수없는 경우,`user_errors` 뷰를 쿼리

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

올바르지 않습니다. 'END procedure_name'을 사용하는 것이 좋습니다. 귀하의 질문에 대한 언급에서 언급했듯이 이름은 일치해야합니다. 어떤 이유로 이러한 오류 중 일부를 제거하도록 질문을 편집했습니다. 이제 컴파일 될 것이지만 그 이유는 틀리며'delCustomer' 대신'delCutomer'를 얻었습니다. –

관련 문제