2011-07-22 53 views
1

我在調用Java中的Oracle存儲過程時遇到問題。我添加了一個存儲過程到數據庫這樣的:無法在java中調用Oracle存儲過程

  String SQL = "CREATE OR REPLACE PROCEDURE LIVERESULTS() " + 
        "IS " + 
        "BEGIN" + 
          " SELECT POOL_ID, POOL_MBR_ID, BSLN_CD, PGE_TYP_NM, SERV_NM, CL_FILE_NM" + 
          " FROM LBMADM.TPPO_MSTR_MAP " + 
          " ORDER BY SERV_NM" + 
          " WHERE PGE_TYP_NM = 'live' ; " + 
        "END"; 

        stmtLIVE = con.createStatement(); 
        stmtLIVE.executeUpdate(SQL); 

而現在我想這樣稱呼它:

CallableStatement cs; 

       try { 
         cs = con.prepareCall("{call LIVERESULTS() }"); 
         rs = cs.executeQuery(); 

         while (rs.next()) { 
..... 

不過,我發現了以下錯誤:

java.sql.SQLException: ORA-06550: line 1, column 7: 
PLS-00905: object UT9J.GENERATE_SQL_FOR_LIVE is invalid 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

我不能完全弄清楚我要去哪裏錯了。我閱讀了Oracle的文檔,我相信我做的都對,但我猜不。如果任何人都能看到這種情況,我會非常感激。

+0

您創建proc'LIVE'並調用'LIVERESULTS' –

+1

@JustYo:沒有錯誤是非常具體的(和OP應該谷歌ORA-nnn看它是什麼)。這是一個通用的*語法*錯誤,表明ORA甚至從來沒有調用錯誤的過程。它不能爲「live()」生成必要的SQL - 例如PLS-00905 - 因爲程序def的「LINE 1」缺少必需的IS關鍵字(例如,語法錯誤ORA-06550)。 – alphazero

+0

我其實有IS,還有正確匹配的LIVERESULTS(我把它複製錯了)。我用Google搜索了它,但我仍然有點卡住。 – thomascirca

回答

8

有多種問題在這裏..

1)爲什麼要創建Java代碼中的程序?您應該使用SQLPLUS或任何其他數據庫工具直接在Oracle中創建它。

2)甲骨文並不希望(),當沒有輸入/輸出/輸入 - 輸出參數,所以你不需要他們。在「創建或替換過程」之後,您還需要「as」或「is」關鍵字。否則,這會給你所看到的編譯時錯誤..

1 CREATE OR REPLACE PROCEDURE LIVE 
    2 IS 
    3 begin 
    4 null; ---This would usually have your logic, 
       --Null indicates "DO nothing". Just to concentrate on 
       --the "declare" issues 
    5* end; 
SQL>/

Procedure created. 

3)第三個錯誤是,你從表中選擇的字段,但目前還沒有可變因素「轉變爲」您所選擇它們。

1 CREATE OR REPLACE PROCEDURE LIVE 
    2 AS 
    3 v_ename scott.emp.ename%type; 
    4 begin 
    5 select ename 
    6  from scott.emp 
    7  where empno = 7369; 
    8* end; 
SQL>/

Warning: Procedure created with compilation errors. 

SQL> show errors 
Errors for PROCEDURE LIVE: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
5/3  PLS-00428: an INTO clause is expected in this SELECT statement 

    1 CREATE OR REPLACE PROCEDURE LIVE 
    2 AS 
    3 v_ename scott.emp.ename%type; 
    4 begin 
    5 select ename 
    6  into v_ename 
    7  from scott.emp 
    8  where empno = 7369; 
    9* end; 
SQL>/

Procedure created. 

4)你正在創建一個名爲「LIVE」的過程,並呼籲「LIVERESULTS」。再次,你不需要()的調用程序之後。 5)根據Allan的評論和Cyber​​nate的回答(+1),如果你試圖返回一個結果集,你應該爲你的select打開一個refcursor,然後將它返回給調用程序。

+0

我實際上在prodcure名稱和IS的加入之間有正確的匹配 - 我有一個不好的C/P。問題是我沒有任何工具可以直接從我的機器訪問數據庫 - 這是一種解決方法。我如何正確處理你的第三點? – thomascirca

+0

1.您應該可以從Oracle或Oracle的免費工具「SQL Developer」下載SQLPLUS以用作開發工具。從Java創建它們是不對的。另外,您的「J2USER」(或您登錄的任何其他Java用戶)在更高的環境中可能沒有「create PROCEDURE」特權。 (好吧,即使在開發環境中,他們也不應該這樣做)。 –

+0

for 3 - 更新了我的文章以上... –

4

該存儲過程LIVE不會沒有錯誤,因爲你有沒有INTO子句的SELECT語句中的SP是無效的編譯。

因此這個問題。使用REF CURSOR返回結果集。

2

除了其他的答案,這都是很好的...

你可能期待的是,由於CREATE PROCEDURE不養的SQLException,程序編譯成功。但這只是表明它成功地作爲SQL語句 - 即創建了一個過程。該過程必須編譯爲PL/SQL代碼,並且由於其他人指出的各種語法錯誤而失敗。在這種情況下,創建過程,所以SQL成功,但它有錯誤並且無效。

的Oracle特定的工具,SQL * Plus一樣,是意識到了這一點,並顯示相應的反饋(「程序與編譯錯誤創建」)作爲Rajesh的答案中。 JDBC不會自動檢查它。如果您確實需要從Java創建,則應在執行CREATESELECT * FROM USER_ERRORS WHERE NAME='LIVERESULTS'後立即檢查錯誤。這將返回與SQL * Plus SHOW ERRORS命令顯示的信息基本相同的信息。

在調用過程之前,您需要解決PL/SQL編譯錯誤。