繁体   English   中英

PL / SQL软件包和软件包主体

[英]PL/SQL Package and Package Body

我已经在程序包主体中创建了一个函数,该函数计算了客户数据库中的当前客户数,并且创建了一个创建客户的函数。 但是我不确定我需要在包装本身中放入什么。 这是包体内的代码。

 FUNCTION count_customer
 RETURN NUMBER is
 total NUMBER;
 BEGIN
 SELECT COUNT(*) into total FROM customer;
 RETURN (total);
 END;


FUNCTION CREATE_CUSTOMER(        
       Country IN VARCHAR2
      ,First_Name IN VARCHAR2
      ,Last_Name IN VARCHAR2
      ,Birth_Date IN VARCHAR2
      ,Customer_Type IN VARCHAR2
      ,Address IN VARCHAR2
) return VARCHAR2 IS
  new_customer_id VARCHAR2(8);
BEGIN
SELECT custid_seq.NEXTVAL
INTO new_customer_id
FROM DUAL;
INSERT INTO customer (Customer_id, Country, First_Name, Last_name, Birth_date, Customer_Type, Address)
VALUES (new_customer_id, Country, First_Name, Last_name, Birth_date, Customer_Type, Address);
total_customers := total_customers + 1;
RETURN (new_customer_id);
end;

然后在包主体中,我用它来计算新的计数。

BEGIN
total_customers := count_customer();
END;

我遇到的问题是在实际包装中放入什么。 我已经在包装内部处理了创建客户,这只是客户计数存在问题。

有任何想法吗?

您需要在包外部声明要访问的任何过程或函数。 默认情况下,它们是私有的,这意味着它们只能在同一包中调用。

公开这两个功能:

CREATE PACKAGE my_package AS
    FUNCTION count_customer
     RETURN NUMBER;

    FUNCTION CREATE_CUSTOMER(        
       Country IN VARCHAR2
      ,First_Name IN VARCHAR2
      ,Last_Name IN VARCHAR2
      ,Birth_Date IN VARCHAR2
      ,Customer_Type IN VARCHAR2
      ,Address IN VARCHAR2
    ) return VARCHAR2;
END my_package;

CREATE PACKAGE BODY ...

文档中还有更多内容

从我所拥有的,但是,我怀疑您真的不希望暴露count_customers() 您需要一个单独的公共函数来返回total_customers的当前值。 尽管这假定所有插入和删除操作始终在程序包中进行,否则计数将不合时宜。

将要从“外部”访问的任何函数或过程的声明部分放在下面,例如:

FUNCTION count_customer RETURN NUMBER;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM