2017-10-18 141 views
0

我已經在java中編寫了下面的代碼。通過java執行pl sql塊的問題

package demo; 

import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Types; 

public class Sample { 

    private Connection c = null; 

    public Sample() 
    { 
     try { 
      c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "jboss"); 
      String plsql = ""+ 
      "declare"+ 
        "x number;"+ 
      "begin "+ 
        "select HEADCOUNT FROM PROJECT where deptid=1;"+ 
      "end;"; 
      CallableStatement cs = c.prepareCall(plsql); 
      //cs.registerOutParameter(0, Types.INTEGER); 

      cs.execute(); 
      System.out.println("Result is "+cs.getInt(1)); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) 
    { 
     Sample z = new Sample(); 
    } 
} 

我只想探索一下我可以通過java來執行plsql塊的機制。上面的 只是簡單的查詢。 上面的Java代碼執行,我得到錯誤的

java.sql.SQLException: Invalid SQL type: sqlKind = UNINITIALIZED 
    at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:75) 
    at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1043) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613) 
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3714) 
    at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4755) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1378) 
    at demo.Sample.<init>(Sample.java:26) 
    at demo.Sample.main(Sample.java:36) 

讓我知道如果有執行這樣的PL/SQL塊之前所需的任何以前的設置。

+3

你認爲怎麼樣' 「申報」 + 「x'給你? –

+0

又見https://stackoverflow.com/questions/36447240/invalid-sql-type-sqlkind-uninitialized-error-is-shown –

+0

爲什麼要用mysql標記,如果你連接到Oracle? –

回答

1

1)第一個問題是在其他答案中提到的declarex...
2)Secound問題是select HEADCOUNT FROM PROJECT where deptid=1;在plsql中,此查詢無效。應該select HEADCOUNT into x ...

0

幾個錯誤:

  1. 的字符串將級聯,declarex,你需要它們之間的空間。
  2. 您未從表INTO中選擇PL/SQL變量的值。
  3. PL/SQL塊沒有將該值放入綁定變量以將其返回給Java(如果直接使用綁定變量,則不需要在PL/SQL中聲明單獨的變量)。
  4. 您已註釋掉註冊輸出參數的行,並且參數是1索引的(不是0索引的)。

事情是這樣的:

import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Types; 

public class Sample { 
    public static void main(final String[] args) 
    { 
    try { 
     Class.forName("oracle.jdbc.OracleDriver"); // If you are using the Oracle driver. 

     Connection con = DriverManager.getConnection(
     "jdbc:oracle:thin:@localhost:1521:XE", 
     "username", 
     "password" 
    ); 

     CallableStatement cs = con.prepareCall(
     "BEGIN SELECT HEADCOUNT INTO :1 FROM PROJECT WHERE deptid=1; END;" 
    ); 
     cs.registerOutParameter(1, Types.NUMERIC); 
     cs.execute(); 
     System.out.println(cs.getInt(1)); 
    } 
    catch (ClassNotFoundException | SQLException ex) 
    { 
     System.err.println(ex.getMessage()); 
    } 
    } 
} 
0

提供字符串中的適當空間,以形成SQL查詢。這是改變了必要空間後的樣子!

String plsql = "declare x number; "+ 
       "begin "+ 
        "select HEADCOUNT FROM PROJECT where deptid=1; "+ 
       "end;"; 

你需要用正確的空格,否則要通過自身希望通過您的Java/JDBC代碼出錯的SQL糾正你的代碼。

你可以改變你PL/SQL代碼如下:

CallableStatement cs = con.prepareCall(
    "BEGIN SELECT HEADCOUNT INTO :1 FROM PROJECT WHERE deptid=1; END;" 
); 

希望這回答你的問題很好!