首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

java调用pl/sql表格报错,求指教啊

2012-10-21 
java调用pl/sql报表报错,求指教啊 !java代码如下package com.oracle.www.produceimport java.sql.Callabl

java调用pl/sql报表报错,求指教啊 !
java代码如下

package com.oracle.www.produce;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Package2 {
public static void main(String args[]) {
int i = 0;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.210:1522:TEST", "apps",
"appstest");
Statement stmt = conn.createStatement();
ResultSet rset = stmt
.executeQuery("select BANNER from SYS.V_$VERSION ");
while (rset.next())
System.out.println(rset.getString(1)); // Print col 1
CallableStatement cs = conn
.prepareCall("{call CUX_YI_ORG_PKG.main(?,?,?,?,?)} ");
// cs.setString(1,null);
// cs.setString(2,null);
cs.registerOutParameter(1, oracle.jdbc.OracleTypes.VARCHAR);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);// 输出参数
cs.setInt(3, 83);
cs.setString(4, "2012/01/05 13:53:41");
cs.setString(5, "2012/10/05 13:53:41");

// System.out.println("i="+i);
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(5);
System.out.println("rs=" + rs);
while (rs.next())
System.out.println(rs.getString(1)); // Print col 1
stmt.close();
} catch (Exception e) {
e.printStackTrace();

} finally {

}
}
}


pl/sql报表如下:::


create or replace package body CUX_YI_TEST_PKG is
 
  lerrormessage VARCHAR2(2000);
  ldebug VARCHAR2(2000);

  PROCEDURE outlog(i_chr_message IN VARCHAR2) IS
  BEGIN
  fnd_file.put_line(fnd_file.log, i_chr_message);
   
  END;

  PROCEDURE output(i_chr_message IN VARCHAR2) IS
  BEGIN
  fnd_file.put_line(fnd_file.output, i_chr_message);
  DBMS_OUTPUT.put_line(i_chr_message); --输出日志
  END;

  --函数1
  --用于返回一个varchar2类型的变量
  function get_OM_Comfirm_Date(p_line_id number) return varchar2 is
  v_OM_Comfirm_Date varchar2(20);
  begin
  select
  to_char(nvl(to_date(tp_attribute15, 'YYYY-MM-DD'),
  mmt.transaction_date),
  'YYYY-MM-DD') ship_date --发运确认时间(Shiping Date)  
  into v_OM_Comfirm_Date
  from mtl_material_transactions mmt, --事物处理表
  wsh_delivery_assignments wda, --出货作业表
  wsh_delivery_details wdd --出货明细
  where mmt.picking_line_id = wda.delivery_detail_id --对应 发运事物处理界面的"详细信息" 
  and mmt.source_line_id = wdd.source_line_id --物流行号
  and wda.delivery_detail_id = wdd.delivery_detail_id --货号编码
  --???
  and nvl(wdd.line_direction, 'O') IN ('O', 'IO')
  and NVL(wda.type, 'S') IN ('S', 'C')
  and mmt.transaction_type_id = 33 --事物处理类型(.销售发运)
  and mmt.transaction_source_type_id = 2 --事物来源类型(销售订单)
  and rownum = 1
  and mmt.source_line_id = p_line_id; --订单行line_id
  
  return v_OM_Comfirm_Date;
  exception
  when others then
  return null;
  end;
  --函数2
  function get_arrivel_date(p_date_time varchar2) return varchar2 is
  v_get_arrivel_date varchar2(10);
  v_get_arriver_date varchar2(10);
  begin 
  select translate(p_date_time, '\' || translate(p_date_time, '\0123456789-', '\'), '\')


  into v_get_arriver_date
  from dual;
  return v_get_arriver_date;
  exception
  when others then
  return null; 
  end;
  --函数3
  FUNCTION Xml_Format(p_Xml IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
  
  RETURN REPLACE(REPLACE 
   
  (REPLACE(REPLACE(REPLACE(p_Xml, '&', '&'),
  '<',
  '&lt;'),
  '>',
  ' &gt;'),
  '"',
  '&quot;'),
  '''',
  '&#39;');
  END Xml_Format;
  

  PROCEDURE Main(
  o_Errcode OUT VARCHAR2,
  o_Errmess OUT VARCHAR2,
  p_ship_org_id IN VARCHAR2, --输出工厂号  
  P_Shiped_Date_F IN VARCHAR2, --搜索起始日期
  P_Shiped_Date_T IN VARCHAR2 --搜索截止日期 
   
  ) IS
  --declare 部分
  --游标定义
  Cursor Cur_Content is
  SELECT BAR.ORGANIZATION_CODE, --Consignor 託運人(取订单行上的出货工厂) 
  BAR.CUSTOMER_NAME, --Consignee 收貨人(取订单上的客户名称)
  BAR.CUSTOMER_PO, --Consignee_PO Number 收貨人訂單編號(取订单行上的客户PO)
  BAR_H.SHIPED_NUMBER SHIP_NUMBER, --出货单号
  BAR_H.CAR_NUMBER, --车次号
  BAR.ORDER_NUMBER,
  --表关联
  nvl(ol.salesrep_id, oh.salesrep_id) salesrep_id,
  oh.sold_to_org_id,
   
  substr(bar.order_number,
  1,
  instr(bar.order_number, '-', 1, 1) - 1) ORDER_NUM, --订单号
  substr(bar.order_number,
  instr(bar.order_number, '-', 1, 1) + 1) LINE_NUM, --订单行号 
  BAR.ORDER_LINE_ID LINE_ID,
   
  --调用函数1
  CUX_YI_TEST_PKG.get_OM_Comfirm_Date(BAR.Order_Line_Id) OM_Comfirm_Date, --DOC_DATE 日期(取订单发运确认日期)


  --调用函数2
  -- CUX_YI_TEST_PKG.get_arrivel_date(substr(BAR_H.SHIPED_DATE,1,10)) Shiped_Date, --ETA_DATE 預計到貨日期(取条码出库中的出货日期)
  --substr(BAR_H.SHIPED_DATE,1,10) Shiped_Date,
   
  to_char(BAR_H.SHIPED_DATE, 'yyyy-mm-dd hh24:mi:ss') Shiped_Date,
  r_name; --排序规则
   
  cursor c1(p_salesrep_id number) is
  select ppf.LOCAL_NAME
  from PER_PEOPLE_F ppf, JTF_RS_SALESREPS jrs
  where ppf.employee_number = jrs.salesrep_number
  and jrs.salesrep_id = p_salesrep_id;
  cursor c2(p_salesrep_id number) is
  select jrs.attribute2
  from PER_PEOPLE_F ppf, JTF_RS_SALESREPS jrs
  where ppf.employee_number = jrs.salesrep_number
  and jrs.salesrep_id = p_salesrep_id;
  cursor c3(h_customer_id number) is 
  select ac.CUSTOMER_NUMBER
  from ar_customers ac
  where ac.customer_id = h_customer_id;
  
  -- SALES_MAN,SALES_AREA,ol.ATTRIBUTE6, customer_number
  SALES_MAN oe_order_lines_all.salesrep_id%type;
  SALES_AREA oe_order_lines_all.salesrep_id%type;
  customer_number oe_order_headers_all.sold_to_org_id%type;
  temp2 oe_order_lines_all.salesrep_id%type ;
  temp1 oe_order_headers_all.sold_to_org_id%type;
  temp3 oe_order_headers_all.salesrep_id%type;
  temp4 oe_order_lines_all.salesrep_id%type ;
  l_Dimension_L number;
  l_Dimension_W number;
  l_Dimension_H number;
  l_Date_Code varchar2(100);
  l_Pallet_No varchar2(100);
  l_SALES_MAN varchar2(100);
  l_SALES_AREA varchar2(100);
  l_End_Cust_PO varchar2(100);
  l_customer_number varchar2(100);
  
  BEGIN
  ldebug := '输出XML头部';
  output('<?xml version="1.0" encoding="UTF-8"?>'); --输出XML头部
  output('<!-- Generated by Oracle Reports version 10.1.2.3.0 -->');
  
  
  END Main;
  
  



end CUX_YI_TEST_PKG;
   


java报错如下:::

Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
PL/SQL Release 11.1.0.7.0 - Production
CORE11.1.0.7.0Production
TNS for IBM/AIX RISC System/6000: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production
i=0
java.sql.SQLException: 无效的列索引
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
at oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:1393)
at com.oracle.www.produce.Package2.main(Package2.java:51)






附:: 因为 字数限制,pl/sql报表的代码不全!!!!!!!!报表在pl/sql上完全没问题的,在erp上完全成功的跑出来了!!!java调用怎么就出错呢
!!!!!!!!!!!!!!

[解决办法]
我看那些例子无非也是这样

cs = this.con.prepareCall("{call RAISE_PRICE(?,?,?)}");
cs.setString(1, coffeeNameArg);
cs.setFloat(2, maximumPercentageArg);
cs.registerOutParameter(3, Types.NUMERIC);
cs.setFloat(3, newPriceArg);

cs.execute();




CallableStatement cs;


try {
// Call a procedure with no parameters
cs = connection.prepareCall("{call myproc}");
cs.execute();

// Call a procedure with one IN parameter
cs = connection.prepareCall("{call myprocin(?)}");

// Set the value for the IN parameter
cs.setString(1, "a string");

// Execute the stored procedure
cs.execute();

// Call a procedure with one OUT parameter
cs = connection.prepareCall("{call myprocout(?)}");

// Register the type of the OUT parameter
cs.registerOutParameter(1, Types.VARCHAR);

// Execute the stored procedure and retrieve the OUT value
cs.execute();
String outParam = cs.getString(1); // OUT parameter

// Call a procedure with one IN/OUT parameter
cs = connection.prepareCall("{call myprocinout(?)}");

// Register the type of the IN/OUT parameter
cs.registerOutParameter(1, Types.VARCHAR);

// Set the value for the IN/OUT parameter
cs.setString(1, "a string");

// Execute the stored procedure and retrieve the IN/OUT value
cs.execute();
outParam = cs.getString(1); // OUT parameter
} catch (SQLException e) {
}


返回的确定是Object类型吗?
换个简单的procedure再试下
[解决办法]
这里有个样例你参考看看:
http://blog.csdn.net/zhaoweitco/article/details/5479200


他是在存储过程的参数上就定义了游标的:

SQL code
create or replace package body pkg_test as  procedure get(p_id int, p_rc out cursor0) is -- 注意这里  begin    dbms_output.put_line(p_id);    open p_rc for      select userid, username, userpwd from users;  end get;end pkg_test;
[解决办法]
从你的过程看,执行时生成报表输出到数据库服务器上的文件中,你从JAVA执行,不能直接返回生成的报表,你还需要用其他方式获取生成的报表,比如生成个链接下载,或者另外建个存储过程读取报表文件的内容返回到JAVA调用。

热点排行