简体   繁体   English

从 java 调用程序 用 oracle 数据库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM