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, '&', '&'),
'<',
'<'),
'>',
' >'),
'"',
'"'),
'''',
''');
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
他是在存储过程的参数上就定义了游标的:
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调用。