求助 存储过程返回table集

[复制链接]
查看11 | 回复9 | 2007-9-26 17:05:46 | 显示全部楼层 |阅读模式
--创建返回的对象
create or replace type chipInResults IS object(
fk_pidnumber(12),
prizeLevelnumber(12),
formerNumbervarchar2(10),
megaNumbervarchar2(2)
);
--定义返回结果集的数组
CREATE OR REPLACE type grade IS TABLE OF chipInResults;
--创建存储过程
create or replace
PROCEDURE PROCEDURE1(gradeArray out grade) is
return grade;
BEGIN
declare
--gradeArray grade:=grade();
chipInResultsObject chipInResults:=null; --new对象
begin
gradeArray :=grade();
for i in reverse 1..3 loop
begin
gradeArray.extend;
chipInResultsObject :=chipInResults(0,null,'0000000000','00');
gradeArray(gradeArray.count) :=chipInResultsObject;
end;
end loop;
for i in 1..3 loop
dbms_output.put_line(gradeArray(i).FK_PID || ': ' || gradeArray(i).FORMERNUMBER || ': ' || gradeArray(i).MEGANUMBER );
end loop;

end;
END PROCEDURE1;
总是报PLW-07203错误,怎么解决的啊,先谢了的,郁闷了
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
我把你的代码拷过去怎么没有报错阿!
我的oracle版本是10g
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
不可能吧,我运行报错的啦
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
代码有错, 正确如下:

SQL> create or replace PROCEDURE PROCEDURE1(gradeArray out grade)
2 is
3chipInResultsObject chipInResults := null;
4BEGIN
5gradeArray := grade();
6for i in reverse 1 .. 3 loop
7begin
8
gradeArray.extend;
9
chipInResultsObject := chipInResults(0, null, '0000000000', '00');
10
gradeArray(gradeArray.count) := chipInResultsObject;
11end;
12end loop;
13for i in 1 .. 3 loop
14dbms_output.put_line(gradeArray(i).FK_PID || ': ' || gradeArray(i)
15
.FORMERNUMBER || ': ' || gradeArray(i)
16
.MEGANUMBER);
17end loop;
18end;
19/
Procedure created
SQL>
SQL> declare
2v_gradeArray grade := grade();
3begin
4PROCEDURE1(v_gradeArray);
5end;
6/
0: 0000000000: 00
0: 0000000000: 00
0: 0000000000: 00
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
我倒没有看运行有没有错误,我只看了看编译有没有错误

还有就是存储过程不能有返回值得!
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
PROCEDURE1(gradeArray out grade)
请大家注意这句话,不错,在oracle中执行是没问题,但用java调用就出现
java.sql.SQLException: ORA-06550: 第 1 行, 第 13 列:
PLS-00306: 调用 'PROCEDURE1' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
这个异情,所以就郁闷了,继续讨论
在oracle中并提示这错误:
[B]Warning(2,22): PLW-07203: 使用 NOCOPY 编译器提示可能对参数 'GRADEARRAY' 有所帮助[/B]
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
Nocopy 修改符
NOCOPY 是 IN OUT 和 OUT 参数模式的修改符。NOCOPY 特性允许您通过引用将参数传递给过程或函数,避免了 CPU 和内存开销。该代码示例也演示了因使用 NOCOPY 修改符而获得的性能改善。

尝试下 OUT NOCOPY
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
另外,楼主也可以考虑用REF CURSOR来实现你的需求。
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
最初由 zhouwf0726 发布
[B]Nocopy 修改符
NOCOPY 是 IN OUT 和 OUT 参数模式的修改符。NOCOPY 特性允许您通过引用将参数传递给过程或函数,避免了 CPU 和内存开销。该代码示例也演示了因使用 NOCOPY 修改符而获得的性能改善。

尝试下 OUT NOCOPY [/B]

当然把NOCOPY加上后不会报警告,但有个问题就是:
java.sql.SQLException: ORA-06550: 第 1 行, 第 13 列:
PLS-00306: 调用 'PROCEDURE1' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
官方的参考地址:
http://www.oracle.com/technology/global/cn/sample_code/tech/java/codesnippet/jdbc/varray/index.html
但同样的,他这是9.0版本的,用10G得到的值为'????'
JAVA代码为(JAR包为

jdbc14):
OracleCallableStatement stmt = (OracleCallableStatement) conn.prepareCall("{?=call procedure1()}&quot

;



stmt.registerOutParameter(1, OracleTypes.ARRAY, "GRADE&quot

;

stmt.executeUpdate();

ARRAY simpleArray = stmt.getARRAY(1);

TchipInResults[] values = (TchipInResults[]) simpleArray.getArray();

for (int i = 0; i < values.length; i++)

System.out.println("row " + i + " = '" + values.getFormerNumber() + "'&quot

;

[B]最后出现的情况,数字可以正常得到,当字符乱码了,以前论坛也有些问题,但没有得到解决的[/B] OracleCallableStatement stmt = (OracleCallableStatement) conn

.prepareCall("{call procedure1(?)}&quot

;

// OracleCallableStatement stmt = (OracleCallableStatement)

// conn.prepareCall("{?=call GETPROCEDURE1()}&quot

;

stmt.registerOutParameter(1, OracleTypes.ARRAY, "GRADE&quot

;

stmt.execute();

ARRAY simpleArray = stmt.getARRAY(1);

// ResultSet rs = simpleArray.getResultSet();

Object[] obj = (Object[]) simpleArray.getArray();

for (int i = 0; i < obj.length; i++) {

STRUCT struct = (STRUCT) obj;

Datum[] dt = struct.getOracleAttributes();

System.out.println(dt[0].longValue());

System.out.println(dt[1].longValue());

System.out.println(dt[2].stringValue());

// System.out.println(dt[3].stringValue());

/**

* for (int n = 0; n < dt.length; n++){

* System.out.println(dt[n].intValue()); }

*/

/*

* /** Object[] dt = struct.getAttributes();

*

* for (int n = 0; n < dt.length; n++){

* System.out.println(String.valueOf(dt[n])); }

*/

}
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
此贴已解决,方案为:加上对应的nls_charset12.jar,在你安装目录\10.2.0\db_1\jdbc\lib下面,有其它解决方案的请继续发表
或者ojdbc14.jar
orai18n.jar两个jar文件,[B]此处要注意对应驱动[/B]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行