2014-11-08 28 views
-1

我是Oracle新手,遇到此問題。Oracle聲明在程序中不起作用

我創造了這樣一個過程:

CREATE OR REPLACE PROCEDURE getArt 
as 
begin 
    select ar.artTitle, ar.artContent, ar.DateCreated, ar.artCategory, ac.accName 
     from hng_art ar 
      join HNG_ACCOUNTS ac 
      on ar.accNo = ac.accNo 
    order by ar.artNo desc 
end getArt; 

我試圖獨立運行SELECT語句和它的工作。但是,當我把它放在一個程序。我沒有工作; 下面是錯誤的:

誤差 「GETART」

ERROR at line 4: PL/SQL: SQL Statement ignored 
ERROR at line 4: PL/SQL: ORA-00933: SQL command not properly ended 
ERROR at line 5: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:  ; 

謝謝

回答

4

幾個錯誤。

目前,編譯器反對您在select語句後缺少分號的事實。 PL/SQL中的每條語句都需要以分號結尾。

修復該問題後,您將看到一個錯誤,因爲存儲過程不能簡單地執行select語句。它必須對結果做些事情。如果你知道你的查詢總是隻返回一行,你可以聲明一些局部變量,並執行select into來填充這些變量。不過,我猜測你的查詢可能會返回多於一行。你可以在你的程序中寫一個for循環,遍歷結果,並對這些行做些什麼。或者你可以聲明你的程序有一個OUT類型的參數SYS_REFCURSOR,爲你的查詢打開一個遊標,並將該遊標返回給調用者。如果你在12.1或更高版本,Oracle引入了一些語法糖,以便程序可以返回結果而不聲明這樣的參數,但我猜這可能不是你所處的情況。

在句法上,你可以做類似

CREATE OR REPLACE PROCEDURE getArt(p_rc OUT sys_refcursor) 
as 
begin 
    open p_rc 
    for 
    select ar.artTitle, ar.artContent, ar.DateCreated, ar.artCategory, ac.accName 
     from hng_art ar 
      join HNG_ACCOUNTS ac 
      on ar.accNo = ac.accNo 
    order by ar.artNo desc; 
end getArt; 

雖然這是合法的,但是,它並不特別習慣。如果您的代碼只是執行select語句,那麼創建視圖而非存儲過程通常會更有意義。如果在返回結果之前對結果進行大量PL/SQL處理,則流水線表函數可能有意義。

+0

我切換查看,併爲我工作。感謝你的建議,我會學習更多。 – hngdev 2014-11-10 16:13:23