2013-04-16 30 views
3

我想創建一個包含四個函數的包。每個功能將添加一組數字並從總數中減去一組。我的語法正確無誤。下面的函數自己工作,我試着在最後調用第一個函數。功能/軟件包問題PL/SQL

當試圖創建包我得到其中在第7行,「出現符號‘END一個錯誤’在需要下列之一時:開始功能編譯程序亞型類型當前光標刪除存在現有0.05秒」

在包體中它說「名稱已被現有對象使用」。我不明白,因爲它必須在包的規範中聲明,創建或替換應該解決這個問題,如果錯誤是已經有一個名爲functionbyfour的包。最後,當我嘗試在包中使用函數時,它表示在遇到下列其中一項時遇到符號「BEGIN」::=。(@%; not null範圍默認字符符號「;」 「替換爲」BEGIN「以繼續ORA-06550:第5行,第43列:PLS-00103:遇到下列其中一項時遇到符號」FROM「:(*%& = - +; < /> at在國防部是不餘REM <>或!=或〜=> = < = <>和或類似LIKE2樣4 likec我使用Oracle快捷版11g和相信新的PL ||之間的多重集我」。

/SQL(4周)。

任何輸入,非常感謝。

CREATE OR REPLACE FUNCTION functionbyfour AS 

FUNCTION functone(first number, second number) RETURN NUMBER ; 
FUNCTION functtwo(first number, second number, third number) RETURN NUMBER ; 
FUNCTION functthree(first number, second number, third number, fourth number) RETURN  NUMBER ; 
FUNCTION functfour(first number, second number, third number, fourth number,fifth number) RETURN NUMBER ; 

END functionbyfour; 
/

CREATE OR REPLACE PACKAGE functionbyfour AS 

FUNCTION functone (first number, second number) RETURN number AS total number; 
BEGIN 
total:=first + second – 1; 
RETURN total; 
DBMS_OUTPUT.PUT_LINE(total); 
END functone; 


FUNCTION functtwo (first number, second number, third number) RETURN number AS total  number; 
BEGIN 
total:=first + second + third – 1; 
RETURN total; 
DBMS_OUTPUT.PUT_LINE(total); 
END functtwo; 

FUNCTION functthree (first number, second number,third number, fourth number)  RETURN  number AS total number; 
BEGIN 
total:=first + second + third + fourth – 1; 
RETURN total; 
DBMS_OUTPUT.PUT_LINE(total); 
END functthree; 


FUNCTION functfour (first number, second number, third number, fourth number, fifth  number) RETURN number AS total number; 
BEGIN 
total:=first + second + third + fourth + fifth – 1; 
RETURN total; 
DBMS_OUTPUT.PUT_LINE(total); 
END functfour; 

/

BEGIN 

SELECT functionbyfour.functone(1,2) FROM DUAL; 

END; 

/

回答

8

您將需要創建

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE PACKAGE functionbyfour AS 
    2 FUNCTION functone(first number, second number) RETURN NUMBER ; 
    3 FUNCTION functtwo(first number, second number, third number) RETURN NUMBER ; 
    4 FUNCTION functthree(first number, second number, third number, fourth number) RETURN  NUMBER ; 
    5 FUNCTION functfour(first number, second number, third number, fourth number,fifth number) RETURN NUMBER ; 
    6* END functionbyfour; 
    7/

Package created. 

命名FunctionByFourCREATE OR REPLACE PACKAGE)一個包,然後一個相應的包體(CREATE OR REPLACE PACKAGE BODY)。您還需要一個END爲包體(現在,你的代碼在第四函數結束時結束)

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE PACKAGE BODY functionbyfour AS 
    2 FUNCTION functone (first number, second number) RETURN number AS total number; 
    3 BEGIN 
    4  total:=first + second - 1; 
    5  RETURN total; 
    6  DBMS_OUTPUT.PUT_LINE(total); 
    7 END functone; 
    8 FUNCTION functtwo (first number, second number, third number) RETURN number AS total  number; 
    9 BEGIN 
10  total:=first + second + third - 1; 
11  RETURN total; 
12  DBMS_OUTPUT.PUT_LINE(total); 
13 END functtwo; 
14 FUNCTION functthree (first number, second number,third number, fourth number)  RETURN  number AS total number; 
15 BEGIN 
16  total:=first + second + third + fourth - 1; 
17  RETURN total; 
18  DBMS_OUTPUT.PUT_LINE(total); 
19 END functthree; 
20 FUNCTION functfour (first number, second number, third number, fourth number, fifth  number) RETURN number AS total number; 
21 BEGIN 
22  total:=first + second + third + fourth + fifth - 1; 
23  RETURN total; 
24  DBMS_OUTPUT.PUT_LINE(total); 
25 END functfour; 
26* END functionbyfour; 
SQL>/

Package body created. 

一旦你做到了這一點,你可以使用函數

SQL> SELECT functionbyfour.functone(1,2) FROM DUAL; 

FUNCTIONBYFOUR.FUNCTONE(1,2) 
---------------------------- 
          2 

如果要將SELECT語句放在PL/SQL塊中,您需要聲明一個局部變量並執行SELECT INTO以使用函數的結果填充局部變量(您也可以將局部變量函數調用的結果不需要使用SELECT)。

SQL> ed 
Wrote file afiedt.buf 

    1 DECLARE 
    2 l_result NUMBER; 
    3 BEGIN 
    4 -- First approach 
    5 l_result := functionByFour.functOne(1,2); 
    6 dbms_output.put_line(l_result); 
    7 -- Second approach 
    8 SELECT functionByFour.functOne(1,2) 
    9  INTO l_result 
10  FROM dual; 
11 dbms_output.put_line(l_result); 
12* END; 
13/
2 
2 

PL/SQL procedure successfully completed. 

而且,要知道,把一個DBMS_OUTPUT.PUT_LINERETURN後聲明是毫無意義的。該代碼永遠無法到達。如果要將結果打印到DBMS_OUTPUT緩衝區,則需要在RETURN之前。

3

你感到困惑獨立的程序和包。

CREATE FUNCTION只能用於創建獨立功能。你在那裏應該有:

CREATE OR REPLACE PACKAGE functionbyfour AS 

一個包由兩部分組成,一個規範和一個主體。規範是API的公共面,正文是實現。作爲軟件包(spec)的包裝體是什麼。所以改變第二塊代碼開始

CREATE OR REPLACE PACKAGE BODY functionbyfour AS 

至少你會讓你的程序結構正確。

Oracle PL/SQL文檔在線,全面且免費。我敦促你閱讀它。 Find out more

4
  1. CREATE OR REPLACE FUNCTION functionbyfour AS 
    

    應該是

    CREATE OR REPLACE PACKAGE functionbyfour AS 
    
  2. CREATE OR REPLACE PACKAGE functionbyfour AS 
    

    應該是

    CREATE OR REPLACE PACKAGE BODY functionbyfour AS 
    
  3. 的第二個字是一個關鍵的詞,你不能把它作爲一個參數名

  4. 你需要一個

    END functionbyfour; 
    

    您的最終functfour之後結束封裝體

  5. 您的dbms_outputs將永遠不會執行,因爲它們在返回之後

  6. 您可以做到這一切在一個函數

    FUNCTION functall(FIRST NUMBER 
            ,sec NUMBER DEFAULT 0 
            ,third NUMBER DEFAULT 0 
            ,fourth NUMBER DEFAULT 0 
            ,fifth NUMBER DEFAULT 0) 
        RETURN NUMBER 
    AS 
        total NUMBER; 
    BEGIN 
        total := first + sec + third + fourth + fifth - 1; 
    
        dbms_output.PUT_LINE(total); 
    
        RETURN total; 
    END functall; 
    
  7. 什麼奇怪的事想幹什麼? :-)

+0

感謝您的輸入,不確定關於第二個關鍵字,(它沒有突出顯示,它似乎工作)。它是一項任務,誰知道教授的想法是什麼?你的代碼看起來更容易,但他說他想要一個包含四個函數的包,所以我不會和他爭論。 –

+0

是的,當我說「不行」時,如果您打開plsql警告並檢查用戶錯誤,我應該說「不應該」,您將得到警告PLW-06010:關鍵字「SECOND」用作定義的名稱 – Dave