我有一个存储过程,它有10个select语句和一个insert语句。 Insert语句将数据插入由10 select语句设置的表中。但我希望这个insert语句不应该在存储过程本身中执行,但我想要10个select语句应该将这10个选定值发送回java代码,然后在java代码中插入语句应该执行。以下是存储过程,请为我提供java代码。
Java代码:
CallableStatement objStatement= null;
Connection objConnection = getConnection();
try { objStatement = objConnection.prepareCall("{call test_proc(?)}"); objStatement.setDate(1 , new java.sql.Date( sysdate1.getTime())); objStatement.executeUpdate();
} catch (SQLException e) { e.printStackTrace();
log.info("There is some problem in Data Generation : Exception"+e);
过程:
CREATE OR REPLACE
PROCEDURE "test_proc"(
p_fromdate DATE)
AS
fromdate DATE;
todate DATE;
emp_id NUMBER := 0;
emp_address NUMBER := 0;
emp_dob NUMBER := 0;
emp_doj NUMBER := 0;
emp_msisdn NUMBER := 0;
emp_name NUMBER := 0;
emp_vehicl_number NUMBER := 0;
emp_vehicl_type NUMBER := 0;
emp_middle_name NUMBER := 0;
emp_last_name NUMBER := 0;
BEGIN
SELECT id INTO emp_id FROM employee ;
SELECT address INTO emp_address FROM employee ;
SELECT dob INTO emp_dob FROM employee ;
SELECT doj INTO emp_doj FROM employee ;
SELECT msisdn INTO emp_msisdn FROM employee ;
SELECT name INTO emp_name FROM employee ;
SELECT vehicle_number INTO emp_vehicl_number FROM employee ;
SELECT vehicle_type INTO emp_vehicl_type FROM employee ;
SELECT middlename INTO emp_middle_name FROM employee ;
SELECT lastNAme INTO emp_last_name FROM employee ;
INSERT
INTO test
(
idofEmp,
Empaddress,
Empdob,
Empdoj,
Empmsisdn,
Empname,
Empvehicle_number,
Empvehicle_type,
Empmiddlename,
EmplastNAme
)
VALUES
(
emp_id,
emp_address,
emp_dob,
emp_doj,
emp_msisdn,
emp_name,
emp_vehicl_number,
emp_vehicl_type,
emp_middle_name,
emp_last_name
);
END;
请忽略数据类型:
我只想要最后一个insert语句应该由java代码执行而不是由procedure.I不想在存储过程中保留insert语句。请建议
答案 0 :(得分:1)
没有必要执行10个单独的SELECT语句来从EMPLOYEE中检索10个单独的字段;你可以在一个声明中做到这一点:
SELECT ID, ADDRESS, DOB, DOJ,
MSISDN, NAME, VEHICLE_NUMBER,
VEHICLE_TYPE, MIDDLENAME, LASTNAME
INTO emp_id, emp_address, emp_dob, emp_doj,
emp_msisdn, emp_name, emp_vehicl_number,
emp_vehicl_type, emp_middle_name, emp_last_name
FROM EMPLOYEE;
但是,因为没有WHERE子句来限制返回的行数,所以如果EMPLOYEE表中有多行,则原始的10个语句和上述语句都将失败并出现TOO_MANY_ROWS异常。
就“返回”INSERT语句而言,执行此操作的一种方法是返回INSERT语句的文本,以便可以从Java执行。类似的东西:
CREATE OR REPLACE FUNCTION test_func(p_fromdate DATE)
RETURN VARCHAR2
AS
fromdate DATE;
todate DATE;
emp_id NUMBER := 0;
emp_address NUMBER := 0;
emp_dob NUMBER := 0;
emp_doj NUMBER := 0;
emp_msisdn NUMBER := 0;
emp_name NUMBER := 0;
emp_vehicl_number NUMBER := 0;
emp_vehicl_type NUMBER := 0;
emp_middle_name NUMBER := 0;
emp_last_name NUMBER := 0;
strInsert_stmt VARCHAR2(2000);
BEGIN
SELECT id, address, dob, doj,
msisdn, name, vehicle_number,
vehicle_type, middlename, lastname
INTO emp_id, emp_address, emp_dob, emp_doj,
emp_msisdn, emp_name, emp_vehicl_number,
emp_vehicl_type, emp_middle_name, emp_last_name
FROM employee;
strInsert_stmt := 'INSERT INTO test ' ||
'(idofEmp, Empaddress, Empdob, Empdoj, ' ||
'Empmsisdn, Empname, Empvehicle_number, ' ||
'Empvehicle_type, Empmiddlename, EmplastNAme) ' ||
'VALUES (' ||
emp_id || ',' ||
emp_address || ',' ||
emp_dob || ',' ||
emp_doj || ',' ||
emp_msisdn || ',' ||
emp_name || ',' ||
emp_vehicl_number || ',' ||
emp_vehicl_type || ',' ||
emp_middle_name || ',' ||
emp_last_name || ')';
RETURN strInsert_stmt;
END TEST_PROC;
最后一点建议 - 在Oracle中,您不应该创建具有小写或混合大小写名称的对象,就像将“test_proc”放在双引号中一样。这样做会导致问题,因为大多数人不会期望在默认(大写)的情况下以其他任何方式命名对象,并且因为将来使用这些对象将要求名称包含在双引号中。例如,我相信要从Java调用过程名称“test_proc”(小写),您需要发送用双引号括起来的名称,如:
objConnection.prepareCall("{call \"test_proc\"(?)}");
如果你必须在程序中添加一个大写模式名称,以便正确解析名称,那就更加丑陋了:
objConnection.prepareCall("{call SOME_SCHEMA.\"test_proc\"(?)}");
根据我的经验,最好创建对象而不将其名称放在双引号中 - 名称将使用大写字母存储,但您仍然可以在较低或混合情况下引用它们,因为Oracle将转换混合大小写或如果混合大小写或小写名称不是双引号,则小写名称为大写。
分享并享受。
如果您更喜欢使用过程而不是函数,请尝试:
CREATE OR REPLACE FUNCTION test_func(p_fromdate IN DATE,
p_insert_stmt OUT VARCHAR2)
RETURN VARCHAR2
AS
fromdate DATE;
todate DATE;
emp_id NUMBER := 0;
emp_address NUMBER := 0;
emp_dob NUMBER := 0;
emp_doj NUMBER := 0;
emp_msisdn NUMBER := 0;
emp_name NUMBER := 0;
emp_vehicl_number NUMBER := 0;
emp_vehicl_type NUMBER := 0;
emp_middle_name NUMBER := 0;
emp_last_name NUMBER := 0;
BEGIN
SELECT id, address, dob, doj,
msisdn, name, vehicle_number,
vehicle_type, middlename, lastname
INTO emp_id, emp_address, emp_dob, emp_doj,
emp_msisdn, emp_name, emp_vehicl_number,
emp_vehicl_type, emp_middle_name, emp_last_name
FROM employee;
p_insert_stmt := 'INSERT INTO test ' ||
'(idofEmp, Empaddress, Empdob, Empdoj, ' ||
'Empmsisdn, Empname, Empvehicle_number, ' ||
'Empvehicle_type, Empmiddlename, EmplastNAme) ' ||
'VALUES (' ||
emp_id || ',' ||
emp_address || ',' ||
emp_dob || ',' ||
emp_doj || ',' ||
emp_msisdn || ',' ||
emp_name || ',' ||
emp_vehicl_number || ',' ||
emp_vehicl_type || ',' ||
emp_middle_name || ',' ||
emp_last_name || ')';
END TEST_PROC;
祝你好运。