2013-04-29 57 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