[英]Call Procedures From java With oracle database
Hello to All stackOverflow goodfellas, I'm so noob in The Procedures with oracle database 21c enterprise edition, As my past background always works with Direct jdbc but now I need to write program with Procedures that call and every time I need to change some Algorithm to call data from database don't change the main code form java. as you know if I do, need compile, build and deploy to server get more time, so going to straight problem view:(I'm not sure is good way or we have better way) I have two table Like :大家好 stackOverflow 的好家伙,我对 oracle 数据库 21c 企业版的过程非常菜鸟,因为我过去的背景总是使用 Direct jdbc 但现在我需要用调用的过程编写程序,每次我需要更改一些算法从数据库调用数据不要更改主代码形式 java。如你所知,如果我这样做,需要编译、构建和部署到服务器获得更多时间,所以直接查看问题:(我不确定是不是好方法或者我们有更好的方法)我有两个表喜欢:
CREATE TABLE C##CREATOR.USERS
(
ID NUMBER(11, 0) NOT NULL
, USERNAME VARCHAR2(20 CHAR) NOT NULL
, DATECREATION TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL
, CONSTRAINT USERS_PK PRIMARY KEY
(
ID
)
DEFERRABLE INITIALLY IMMEDIATE
USING INDEX
(
CREATE INDEX C##CREATOR.USERS_PK ON C##CREATOR.USERS (ID ASC)
LOGGING
TABLESPACE DPS_PERMANENT
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOPARALLEL
)
ENABLE
)
LOGGING
TABLESPACE DPS_PERMANENT
PCTFREE 10
INITRANS 1
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOCOMPRESS
NO INMEMORY
NOPARALLEL;
And:和:
CREATE TABLE C##CREATOR.USERPASSWORDS
(
ID NUMBER(11, 0) NOT NULL
, USERID NUMBER(11, 0) NOT NULL
, PASSWORD VARCHAR2(20 BYTE) NOT NULL
, DATECREATION TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL
, CONSTRAINT USERPASSWORDS_PK PRIMARY KEY
(
ID
)
USING INDEX
(
CREATE UNIQUE INDEX C##CREATOR.USERPASSWORDS_PK ON C##CREATOR.USERPASSWORDS (ID ASC)
LOGGING
TABLESPACE DPS_PERMANENT
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOPARALLEL
)
ENABLE
)
LOGGING
TABLESPACE DPS_PERMANENT
PCTFREE 10
INITRANS 1
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOCOMPRESS
NO INMEMORY
NOPARALLEL;
As other side In Procedures:作为程序中的另一方:
CREATE OR REPLACE PROCEDURE SYSTEM_LOGIN_GET_USER_WITH_PASSWORD
(
INP_USERNAME IN VARCHAR2
, user_cursor OUT SYS_REFCURSOR
) AS
BEGIN
OPEN user_cursor FOR
SELECT USERS.USERNAME , USERS.ID , USERPASSWORDS.PASSWORD FROM USERS
LEFT OUTER JOIN USERPASSWORDS
ON USERS.ID = USERPASSWORDS.USERID WHERE
USERS.USERNAME = INP_USERNAME ORDER BY USERPASSWORDS.DATECREATION DESC
FETCH FIRST 1 ROWS ONLY;
END SYSTEM_LOGIN_GET_USER_WITH_PASSWORD;
If Calling from Java with:如果从 Java 拨打:
package mehritco.ir.megnatis.dps.repository;
import mehritco.ir.megnatis.dps.repository.rdbms.oracle.OracleConnection;
import mehritco.ir.megnatis.users.User;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import java.sql.*;
public class RepoUsers {
public User get(User userToFind){
try {
Connection oracleConnection = OracleConnection.getPoolConnection().getConnection();
String queryToGetUser ="{ execute SYSTEM_LOGIN_GET_USER_WITH_PASSWORD(?,?) }";
CallableStatement callableStatement = oracleConnection.prepareCall(queryToGetUser);
callableStatement.setString(1,userToFind.getUsername());
callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
callableStatement.execute();
ResultSet resultSet = ((OracleCallableStatement)callableStatement).getCursor(2);
while (resultSet.next()) {
for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){
System.out.println(resultSet.getString(i));
}
}
return null;//for test
}catch (SQLException sqlException){
sqlException.printStackTrace();
System.out.println(sqlException.getMessage());
return null;
}
}
}
I got error:我收到错误:
java.sql.SQLException: Non supported SQL92 token at position: 3
I found my Mistake around:我发现了我的错误:
{ execute SYSTEM_LOGIN_GET_USER_WITH_PASSWORD(?,?) }
and when changed to 'call' works.当更改为“呼叫”时有效。
{ call SYSTEM_LOGIN_GET_USER_WITH_PASSWORD(?,?) }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.