2013-04-29 62 views
0

我创建了一个包和一个包体,但我不确定如何测试持久包变量中的值。调用一个持久化包变量

这里是包代码,其相当简单,只是一个删除程序和创建功能,它们都在包体中。

CREATE OR REPLACE PACKAGE customers AS 
FUNCTION create_customer (Country VARCHAR2, First_Name VARCHAR2, Last_name VARCHAR2, 
        Birth_date VARCHAR2, Customer_Type VARCHAR2, Address VARCHAR2) 
RETURN VARCHAR2; 
PROCEDURE remove_customer (customer_id VARCHAR2); 
FUNCTION count_customer RETURN NUMBER; 
END customers; 

喏,这就是包体

create or replace package body customers AS 
total_customers 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 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; 
PROCEDURE remove_customer (customer_id VARCHAR2) IS 
BEGIN 
DELETE FROM customer 
WHERE customer.customer_id = remove_customer.customer_id; 
total_customers := total_customers - 1; 
END; 
BEGIN 
select count(*) into total_customers from customer; 
END; 

的total_customers是我的执着包变量,只有本地的这个包我只是想知道我可以测试一下,看看目前保存的值变量。

感谢您的帮助

+0

您是否尝试添加一个返回当前值的公共函数? (我认为我在你以前的问题上建议过)。 – 2013-04-29 12:04:18

+0

嗨,我不确定这会如何工作对不起,我非常了解PLSQL – 2013-04-29 12:08:34

+0

正如亚历克斯提到的那样,'total_customers'的值仅在一个会话中有效。因为Oracle数据库上的PL/SQL应用程序几乎可以肯定是多用户的,所以我会将它变成一个返回客户总数“count”的函数。 – 2013-04-29 14:54:02

回答

1

在你的包规范加:

function get_total_customers return number; 

在你的包体加:

function get_total_customers return number is 
begin 
    return total_customers; 
end get_total_customers; 
从SQL可以 select customers.get_total_customers from dual

然后。

另一种方法是让包变量在规范中定义而不是在主体中定义,但是它可以在外部和读取时进行更改。

无论哪种方式,价值只会是有意义的within a session;如果你在一个会话中设置它,那么在另一个会话中将不可见。两者都可以计算出来,但如果你在一个会话中调用create_customer(),另一个会报告旧的总数。

+0

嗯我已经尝试添加到我已经得到的代码,但由于某种原因,它不喜欢它,并产生一个错误,然后'结束' – 2013-04-29 12:30:36

+0

对不起,错过了一个分号... – 2013-04-29 12:32:21

+0

非常感谢帮助 – 2013-04-29 12:42:02

0

把你的变量包装规格,测试它。然后将其放回体内或放入规格中。保持简单...

+0

变量不能从SQL引用,只有函数可以。 – 2013-04-29 14:51:20

+0

@Colin - 不是真的:Package_name.Variable_name - 这是你如何引用它。此外,将变量移动到规范不会阻止它与函数一起使用。 – Art 2013-04-29 15:40:41

+0

'SELECT package_name.variable_name FROM DUAL;'不起作用,您需要创建一个返回它的函数 - 如果您想从SQL进行测试,这就是我的观点。 – 2013-04-29 15:42:08