ITPUB论坛-专业的IT技术社区

标题: 存储过程中的参数类型问题 [打印本页]

作者: sxlcom    时间: 2009-3-3 12:38
标题: 存储过程中的参数类型问题
本人目前想在java中调用oracle的存储过程,但在java中传递的参数是一个String []  数组,我在存储过程中以什么样的类型来接受这个参数呢?
作者: sxlcom    时间: 2009-3-3 14:03
如果是varchar2,我如何去拆分里面的值呢,
作者: sxlcom    时间: 2009-3-3 14:04
还有如果String []  有1000个值,则会超出varchar2的最大长度
作者: sqleee    时间: 2009-3-3 16:45
在pl/sql变量中varchar2的长度是32765,而不是4000.

并且你也可以自定义类型,oracle的大文本类型那么多
作者: duanzhihui    时间: 2009-3-3 16:55
……你存储过程还没写好啊?连啥参数都不知道~~,如果参数是Varchar2的,就直接把Java的数组拆成参数要求那种形式的
作者: gkl0818    时间: 2009-3-3 16:59
你是不是要传一个字符数组给存储过程???
作者: sxlcom    时间: 2009-3-3 17:09
你是不是要传一个字符数组给存储过程???
==============================
是的现在我的 字符数组中的内容可能会很大,所以我想如果超出varchar2的最大值就会报错,现在就是不知道用什么类型直接可以接受这个字符数组
如果用大对像,这样操作就比较烦锁
作者: HelloWorld_001    时间: 2009-3-3 17:24
我也有同样的问题
当初想在过程中传个数组给JAVA不知道怎么写,最后换别的方式解决的
过程都写好了,JAVA中不知道用什么参数接受,得不到这个值
作者: sxlcom    时间: 2009-3-3 17:30
请问楼上的你是改用了什么方式
作者: dingjun123    时间: 2009-3-3 17:46
java中数组和存储过程的嵌套表是可以相互映射的,你可以看下java.sql,有Array的,有空写个例子发上来
作者: sxlcom    时间: 2009-3-3 19:44
其实我与想到了这个,但我在调试时总是报内部转换错误,太谢谢了,本人处理这个功能比较急,先谢了
作者: sxlcom    时间: 2009-3-3 19:45
我用的是spring jdbc
作者: sxlcom    时间: 2009-3-3 20:30
以下是我的代码,但是总是报rg.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{call study_array_nick(?, ?)}]; SQL state [null]; error code [17059]; 无法转换为内部表示: [Ljava.lang.String;@4ee70b; nested exception is java.sql.SQLException: 无法转换为内部表示: [Ljava.lang.String;@4ee70b
java.sql.SQLException: 无法转换为内部表示: [Ljava.lang.String;@4ee70b

==================================================================================

create table study_array_nick_tab   
(   
  name varchar2(200)   
);   
  
create or replace type study_array_nick_list is VARRAY(1000) of varchar2(200);  



create or replace procedure study_array_nick(in_array in study_array_nick_list,aa out char) is  
  v_i number;   
begin  
  for v_i in 1 .. in_array.count loop   
    insert into study_array_nick_tab(name) values(in_array(v_i));   
  end loop;   

  commit;   
    aa:='1';
exception when others then  
rollback;  
   aa:='0';
raise_application_error('20999','测试错误');   
end study_array_nick;  


---------------------------java代码实现---------------------------------------
public String currency_StoredProcedureExecute1(String[] param1) throws Exception{
                BulkStoredProcedure proc = new BulkStoredProcedure(getJdbcTemplate().getDataSource()) ;
                 Map results = proc.execute(param1,param2,param3);       
                String re_Sring = printflag1(results);
                return re_Sring.trim();
        }

        private class BulkStoredProcedure extends StoredProcedure {
                public static final String SQL = "study_array_nick";
                public BulkStoredProcedure(DataSource ds) {
                        setDataSource(ds);
                        setSql(SQL);
                        setFunction(false);
                        declareParameter(new SqlParameter("param_1",java.sql.Types.ARRAY));
                                declareParameter(new SqlOutParameter("ob_status", OracleTypes.CHAR,
                                        new RowMapper() {
                                                public Object mapRow(ResultSet rs, int rowNum)
                                                                throws SQLException {
                                                        String vo = rs.getString(1);
                                                                return vo;
                                                }
                                        }));
                        compile();
                }
                 public Map execute(String[] param1) {
                               Map inputs = new HashMap();
                        inputs.put("param_1", param1);
                                                    return super.execute(inputs);
                      }
        }
        private String printflag1(Map r) {
                String re_status = null;
                for (Iterator it = r.entrySet().iterator(); it.hasNext() {
                        Map.Entry entry = (Map.Entry) it.next();
                        re_status = (String) entry.getValue();
                }
                return re_status;
        }
作者: gkl0818    时间: 2009-3-3 21:11
http://www.cnblogs.com/gkl0818/archive/2008/12/20/1359080.html

你看看这个能不能帮助你
作者: dingjun123    时间: 2009-3-3 22:10
[php]
这东西主要对oracle提供的api要熟悉。
比如存储过程是这样写的,里面传入nested table,如下:
create type strings is table of varchar2(10);--nested table

--create table
drop table test;
create table test (name varchar2(10));

/
--procedure
create or replace procedure testoracle(param in strings)--param is nested table
as
begin
       for i in param.first .. param.last loop
           insert into test values(param(i));
       end loop;
       commit;
end testoracle;
/
--java,加入ojdbc14.jar
package com.jdbc.procedure;

import java.sql.Connection;
import java.sql.DriverManager;

import oracle.jdbc.driver.OracleCallableStatement;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

public class procedure01 {

        public static void main(String[] args) throws Exception {
                Class.forName("oracle.jdbc.driver.OracleDriver";
                Connection conn = DriverManager.getConnection(
                                "jdbcracle:thin:@localhost:1521ra", "dj", "123456";
               
                // 创建String[]
                int[] arr = { 1, 2 };
                //利用oracle API
                OracleCallableStatement stmt = (OracleCallableStatement) conn
                                .prepareCall("{call testoracle(?)}";
                // ARRAY(ArrayDescriptor, Connection, Object)
                //创建ArrayDescriptor,其中第1个参数是对应oracle中的嵌套表类型
                ArrayDescriptor desc = ArrayDescriptor
                                .createDescriptor("STRINGS", conn);
                //创建ARRAY对象,将java数组传入
                ARRAY array = new ARRAY(desc, conn, arr);
                //设置存储过程参数
                stmt.setARRAY(1, array);
                stmt.execute();
        }

}
-----

SQL> select * from test;

NAME
----------
1
2
[/php]
作者: dingjun123    时间: 2009-3-3 22:11
变形了

[ 本帖最后由 dingjun123 于 2009-3-3 22:14 编辑 ]

1.jpg (941.24 KB, 下载次数: 4)

1.jpg

作者: sxlcom    时间: 2009-3-4 17:12
如果写成spring jdbc  来继承StoredProcedure如何处理




欢迎光临 ITPUB论坛-专业的IT技术社区 (http://www.itpub.net/) Powered by Discuz! X3.2