gpt4 book ai didi

java - Oracle 调用 Java 过程时出现 ORA-01722

转载 作者:行者123 更新时间:2023-12-02 02:06:40 25 4
gpt4 key购买 nike

我想做的是从控制台获取输入并通过过程调用将它们插入到数据库中。发生的情况是每次我尝试运行它时都会收到错误。

ORA-01722: invalid number ORA-06512: at "xxxxxxxx.CREATE_APPLICATIONS", line 16 ORA-06512: at line 1

这是我尝试运行的过程:

private String insert_application() {
try {
Connection conn = cf.getConnection();
String sql = "{call create_applications (?,?,?,?,?,?,?,?,?,?,?,?)}";

CallableStatement call = conn.prepareCall(sql);

call.setString(1, this.getFirst_name());
call.setString(2, this.getLast_name());
call.setString(3, this.getAddress());
call.setString(4, this.getCity());
call.setString(5, this.getState());
call.setInt(6, Integer.parseInt(this.getZipcode()));
call.setString(7, this.getUsername());
call.setString(8, this.getPassword());
call.setInt(9, Integer.parseInt(this.getPhone()));
call.setInt(10, Integer.parseInt(this.getSSN()));
call.setString(11, this.getStatus());
call.setString(12, this.getAccount_type());

call.execute();
} catch (SQLException e) {
e.printStackTrace();
return "Error: Having issues with the database. Please try again later! Inserting error";
}

return "File created!";
}

这是存储过程:

CREATE OR REPLACE PROCEDURE create_applications
( FIRST_NAME IN BANKING_APPLICATIONS.FIRST_NAME%TYPE,
LAST_NAME IN BANKING_APPLICATIONS.LAST_NAME%TYPE,
ADDRESS IN BANKING_APPLICATIONS.ADDRESS%TYPE,
CITY IN BANKING_APPLICATIONS.CITY%TYPE,
STATE IN BANKING_APPLICATIONS.STATE%TYPE,
ZIPCODE IN BANKING_APPLICATIONS.ZIPCODE%TYPE,
USERNAME IN BANKING_APPLICATIONS.USERNAME%TYPE,
PASSWORD IN BANKING_APPLICATIONS.PASSWORD%TYPE,
SSN IN BANKING_APPLICATIONS.SSN%TYPE,
PHONE IN BANKING_APPLICATIONS.PHONE%TYPE,
STATUS IN BANKING_APPLICATIONS.STATUS%TYPE,
ACCOUNT_TYPE IN BANKING_APPLICATIONS.ACCOUNT_TYPE%TYPE)
AS
BEGIN
INSERT INTO BANKING_APPLICATIONS
VALUES (APPLICATION_SEQ.NEXTVAL, FIRST_NAME, LAST_NAME, ADDRESS, CITY,
STATE, ZIPCODE, USERNAME, PASSWORD, PHONE, SSN, STATUS,
CLAIM_NUMBER_SEQ.NEXTVAL, ACCOUNT_TYPE);
COMMIT;
END;
/

这是两个序列:

CREATE SEQUENCE APPLICATION_SEQ START WITH 1;

CREATE OR REPLACE TRIGGER APPLICATION_BIR
BEFORE INSERT ON BANKING_APPLICATIONS
FOR EACH ROW
BEGIN
SELECT APPLICATION_SEQ.NEXTVAL
INTO :new.APPLICATION_ID
FROM dual;
END;
/

CREATE SEQUENCE CLAIM_NUMBER_SEQ START WITH 1;

CREATE OR REPLACE TRIGGER CLAIM_NUMBER_BIR
BEFORE INSERT ON BANKING_APPLICATIONS
FOR EACH ROW
BEGIN
SELECT CLAIM_NUMBER_SEQ.NEXTVAL
INTO :new.CLAIM_NUMBER
FROM dual;
END;
/

这是表定义:

CREATE TABLE "BANKING_APPLICATIONS" 
("APPLICATION_ID" NUMBER(15,0) NOT NULL ENABLE,
"FIRST_NAME" VARCHAR2(15 BYTE) NOT NULL ENABLE,
"LAST_NAME" VARCHAR2(25 BYTE) NOT NULL ENABLE,
"ADDRESS" VARCHAR2(50 BYTE) NOT NULL ENABLE,
"CITY" VARCHAR2(25 BYTE) NOT NULL ENABLE,
"STATE" VARCHAR2(30 BYTE) NOT NULL ENABLE,
"ZIPCODE" NUMBER(5,0) NOT NULL ENABLE,
"USERNAME" VARCHAR2(15 BYTE) NOT NULL ENABLE,
"PASSWORD" VARCHAR2(15 BYTE) NOT NULL ENABLE,
"PHONE" NUMBER(10,0) NOT NULL ENABLE,
"SSN" NUMBER(9,0) NOT NULL ENABLE,
"CLAIM_NUMBER" NUMBER(15,0) NOT NULL ENABLE,
"STATUS" VARCHAR2(20 BYTE) NOT NULL ENABLE,
"ACCOUNT_TYPE" VARCHAR2(20 BYTE) NOT NULL ENABLE
);

最佳答案

INSERT 语句的 VALUES 部分如下所示:

SSN, 
STATUS,
CLAIM_NUMBER_SEQ.NEXTVAL,
ACCOUNT_TYPE
);

您尚未指定目标投影,因此 VALUES 按列位置顺序映射到表。如果我们查看您的表格,我们可以看到您的表格如下所示:

"SSN" NUMBER(9,0) NOT NULL ENABLE, 
"CLAIM_NUMBER" NUMBER(15,0) NOT NULL ENABLE,
"STATUS" VARCHAR2(20 BYTE) NOT NULL ENABLE,
"ACCOUNT_TYPE" VARCHAR2(20 BYTE) NOT NULL ENABLE

因此,您的 INSERT 尝试将 status 参数应用于 claim number 列,反之亦然。问题在于 status 是字符串,但 claim number 是数字,这就是为什么您会收到 ORA-01722: invalid number

How do I specify Target projection?

通过在 VALUES 子句之前列出目标列:

INSERT INTO BANKING_APPLICATIONS(
APPLICATION_ID,
FIRST_NAME,
LAST_NAME,
ADDRESS,
CITY,
STATE,
ZIPCODE,
USERNAME,
PASSWORD,
PHONE,
SSN,
STATUS,
CLAIM_NUMBER,
ACCOUNT_TYPE)
VALUES (
APPLICATION_SEQ.NEXTVAL,
FIRST_NAME,
LAST_NAME,
ADDRESS,
CITY,
STATE,
ZIPCODE,
USERNAME,
PASSWORD,
PHONE,
SSN,
STATUS,
CLAIM_NUMBER_SEQ.NEXTVAL,
ACCOUNT_TYPE)

这里目标项目匹配 VALUES 子句中属性的顺序,而不是表位置。

<小时/>

顺便说一下,您会注意到我用每行一个元素来布置语句。这使得查看错误变得很容易。整齐的布局不仅仅是迂腐。可读性是一项功能,具有该功能的代码更容易诊断(并且可以说一开始就不太容易出现错误)。

关于java - Oracle 调用 Java 过程时出现 ORA-01722,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50664442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com