如何返回insert语句以通过java代码而不是存储过程来执行它

时间:2015-03-17 05:03:01

标签: plsql

我有一个存储过程,它有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语句。请建议

1 个答案:

答案 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;

祝你好运。