一段oracle数据转换为excel表格的程序!

[复制链接]
查看11 | 回复9 | 2008-6-18 17:33:55 | 显示全部楼层 |阅读模式
这是一段oracle数据转换为excel表格的程序,
应用了excel的dde(动态数据交换),编译出错,请问 EXCEL97
的版本足够吗,还应该安装什么东东!请熟悉的朋友提示!
前面的function没问题的!
SQL> create or replace type myobjectype as object (x number,y number,z number);
2/
Type created.
SQL> create or replace type mytabletype as table of myobjectype
2/
Type created.
commit;
Commit complete.
sQL> create or replace function testrerecordtabname (c_tj in varchar2)
return mytabletype
as
l_data mytabletype :=mytabletype();
strsql varchar2(500);
type v_cursor is ref cursor;
v_tempcursor v_cursor;
i1 number;
i2 number;
i3 number;
begin
strsql := 'select year,month,byyd from jhhyyd where ' || c_tj;
open v_tempcursor for strsql;
loop
fetch v_tempcursor into i1,i2,i3;
l_data.extend;
l_data(l_data.count) := myobjectype(i1,i2,i3);
exit when v_tempcursor%NOTFOUND;
end loop;
return l_data;
end;
/
Function created.
SQL> commit;
SQL> set serveroutput on
SQL> declare
testre mytabletype :=mytabletype();
i number :=0;
crow varchar2(8);
ccol1 varchar2(8);
ccol2 varchar2(8);
ccol3 varchar2(8);
convid pls_integer;
begin
testre := testrerecordtabname('year=2003 and month=5');
convid:=dde.initiate('EXCEL','C:\excel.xls');
dde.poke(convid,'R1C1','年',dde.cf_text,1000);
dde.poke(convid,'R1C2','月',dde.cf_text,1000);
dde.poke(convid,'R1C3','本月用电',dde.cf_text,1000);
loop
i := i+1;
--dbms_output.put_line(';' || testre(i).x || ';' || testre(i).y || ';' || testre(i).z || ';');
crow:=i+1;
ccol1:='R'||crow||'C1';
ccol2:='R'||crow||'C2';
ccol3:='R'||crow||'C3';
dde.poke(convid,ccol1,testre(i).x,dde.cf_text,2000000000);
dde.poke(convid,ccol2,testre(i).y,dde.cf_text,2000000000);
dde.poke(convid,ccol3,testre(i).z,dde.cf_text,2000000000);
exit when i = testre.count;
end loop;
dde.terminate(convid);
end;
/
错误位于第1行:
ORA-06550: 第 11 行, 第 15 列:
PLS-00201: 必须说明标识符 'DDE.INITIATE'
ORA-06550: 第 11 行, 第 7 列:
PL/SQL: Statement ignored
ORA-06550: 第 12 行, 第 35 列:
PLS-00201: 必须说明标识符 'DDE.CF_TEXT'
ORA-06550: 第 12 行, 第 7 列:
PL/SQL: Statement ignored
ORA-06550: 第 13 行, 第 35 列:
PLS-00201: 必须说明标识符 'DDE.CF_TEXT'
ORA-06550: 第 13 行, 第 7 列:
PL/SQL: Statement ignored
ORA-06550: 第 14 行, 第 41 列:
PLS-00201: 必须说明标识符 'DDE.CF_TEXT'
ORA-06550: 第 14 行, 第 7 列:
PL/SQL: Statement ignored
ORA-06550: 第 22 行, 第 42 列:
PLS-00201: 必须说明标识符 'DDE.CF_TEXT'
ORA-06550: 第 22 行, 第 8 列:
PL/SQL: Statement ignored
ORA-06550: 第 23 行, 第 42 列:
PLS-00201: 必须说明标识符 'DDE.CF_TEXT'
ORA-06550: 第 23 行, 第 8 列:
PL/SQL: Statement ignored
ORA-06550: 第 24 行, 第 42 列:
PLS-00201: 必须说明标识符 'DDE.CF_TEXT'
ORA-06550: 第 24 行, 第 8 列:
PL/SQL: Statement ignored
ORA-06550: 第 27 行, 第 4 列:
PLS-00201: 必须说明标识符 'DDE.TERMINATE'
ORA-06550: 第 27 行, 第 4 列:
PL/SQL: Stateme
回复

使用道具 举报

千问 | 2008-6-18 17:33:55 | 显示全部楼层
sqlplus中用不了dde吧,那是forms带的buit-in package。
回复

使用道具 举报

千问 | 2008-6-18 17:33:55 | 显示全部楼层
请问gengmao
forms中如何实现该段程序
在触发器中写如上代码,好象自定义对象类型无法编译
即该句有问题:testre mytabletype :=mytabletype();
回复

使用道具 举报

千问 | 2008-6-18 17:33:55 | 显示全部楼层
forms的pl/sql引擎无法支持用户自定义类型:(
建议换用数据库自带的utl_file包,将数据导出为逗号分隔的文件(csv文件,EXCEL可以处理这种文件格式)。只是文件导出在数据库服务器端,而不是客户端。
回复

使用道具 举报

千问 | 2008-6-18 17:33:55 | 显示全部楼层
谢谢gengmao
其实如果是静态条件的结果集,不采用自定义类型,是可以的成功的。
问题是如果用户多条件组合查询的结果集即select * from tablename where where_clause
传到.csv文本或excel怎么解决!
回复

使用道具 举报

千问 | 2008-6-18 17:33:55 | 显示全部楼层
问题是如果用户多条件组合查询的结果集即select * from tablename where where_clause
传到.csv文本或excel怎么解决!

没看明白你的意思?
utl_file的用法论坛上有很多例子,搜索一下。
如果一定要用forms将数据导出到客户端,可以创建数据库存储过程,该过程返回refcursor或者pl/sql集合类型变量。然后在forms中可以用dde,ole,或者text_io输出。
回复

使用道具 举报

千问 | 2008-6-18 17:33:55 | 显示全部楼层
CREATE OR REPLACE
package pkg_test as
type myrctype is ref cursor;
function get(intid varchar2) return myrctype;
end pkg_test;
/
CREATE OR REPLACE
package body pkg_test as
function get(intid varchar2) return myrctype is --函数体
rc myrctype;--定义ref cursor变量
sqlstr varchar2(500);
begin
if intid='0' then
--静态测试,直接用select语句直接返回结果
open rc for select id,name,sex,address,postcode,birthday from student;
else
--动态sql赋值,用:w_id来申明该变量从外部获得
sqlstr := 'select id,name,sex,address,postcode,birthday from student where '||intid;
--动态测试,用sqlstr字符串返回结果,用using关键词传递参数
open rc for sqlstr ;
end if;
return rc;
end get;
end pkg_test;
/
3用pl/sql块进行测试:
declare
w_rc pkg_test.myrctype; --定义ref cursor型变量
--定义临时变量,用于显示结果
w_id student.id%type;
w_name student.name%type;
w_sexstudent.sex%type;
w_addressstudent.address%type;
w_postcode student.postcode%type;
w_birthday student.birthday%type;
i number :=0;
begin
--调用函数,获得记录集
w_rc := pkg_test.get('sex=''女'' and id=2');
--fetch结果并显示
loop
fetch w_rc into w_id,w_name,w_sex,w_address,w_postcode,w_birthday;
dbms_output.put_line(w_name||','||w_sex||','||w_address||','||w_postcode||','||w_birthday);
exit when w_rc%notfound;
end loop;
end;
/
4、测试结果:
通过。
问题是我如何在forms中应用该结果集:
即声明w_rc pkg_test.myrctype; --定义ref cursor型变量
回复

使用道具 举报

千问 | 2008-6-18 17:33:55 | 显示全部楼层
原先用pl/sql块进行测试的程序段想用form的pl/sql进行测试:
declare
w_rc pkg_test.myrctype; --定义ref cursor型变量
--定义临时变量,用于显示结果
w_id student.id%type;
w_name student.name%type;
w_sex student.sex%type;
w_address student.address%type;
w_postcode student.postcode%type;
w_birthday student.birthday%type;
i number :=0;
begin
--调用函数,获得记录集
w_rc := pkg_test.get('sex=''女'' and id=2');
--fetch结果并显示
loop
fetch w_rc into w_id,w_name,w_sex,w_address,w_postcode,w_birthday;
dbms_output.put_line(w_name||','||w_sex||','||w_address||','||w_postcode||','||w_birthday);
exit when w_rc%notfound;
end loop;
end;
回复

使用道具 举报

千问 | 2008-6-18 17:33:55 | 显示全部楼层
在forms程序单元中使用存储过程传回的ref cursor有一点问题,但是可以解决。
http://metalink.oracle.com/metal ... =1&p_showHelp=1
另外最好改用存储过程,不要用函数返回ref cursor。
回复

使用道具 举报

千问 | 2008-6-18 17:33:55 | 显示全部楼层
过程返回结果集
CREATE OR REPLACE PACKAGE pkg_test
AS
TYPE myrctype IS REF CURSOR;
PROCEDURE get (p_id varchar2, p_rc OUT myrctype);
END pkg_test;
/
程序包已创建
CREATE OR REPLACE PACKAGE BODY pkg_test
AS
PROCEDURE get (p_id varchar2, p_rc OUT myrctype)
IS
sqlstr VARCHAR2 (500);
BEGIN
IF p_id = '0'THEN
OPEN p_rc FOR

SELECT ID, NAME, sex, address, postcode, birthday

FROM student;
ELSE
sqlstr :=

'select id,name,sex,address,postcode,birthday
from student where '||p_id;
OPEN p_rc FOR sqlstr ;
END IF;
END get;
END pkg_test;
/
程序包主体已创建。
declare
w_rc pkg_test.myrctype; --定义ref cursor型变量
--定义临时变量,用于显示结果
w_id student.id%type;
w_name student.name%type;
w_sexstudent.sex%type;
w_addressstudent.address%type;
w_postcode student.postcode%type;
w_birthday student.birthday%type;
i number :=0;
begin
--调用过程,获得记录集
pkg_test.get('sex=''女'' and id=2',w_rc);
--fetch结果并显示
loop
fetch w_rc into w_id,w_name,w_sex,w_address,w_postcode,w_birthday;
dbms_output.put_line(w_name||','||w_sex||','||w_address||','||w_postcode||','||w_birthday);
exit when w_rc%notfound;
end loop;
end;
里ssfs,女,asdasdas,25660000,
里ssfs,女,asdasdas,25660000,
PL/SQL 过程已成功完成。

谢谢斑竹大虾热心,以前没用过forms
主要是这一段程序在form的触发器中如何实现,即
好象定义w_rc pkg_test.myrctype;
--定义ref cursor型变量
编译通不过!。。。。。。。。。。

declare
w_rc pkg_test.myrctype; --定义ref cursor型变量
--定义临时变量,用于显示结果
w_id student.id%type;
w_name student.name%type;
w_sexstudent.sex%type;
w_addressstudent.address%type;
w_postcode student.postcode%type;
w_birthday student.birthday%type;
i number :=0;
begin
--调用过程,获得记录集
pkg_test.get('sex=''女'' and id=2',w_rc);
--fetch结果并显示
loop
fetch w_rc into w_id,w_name,w_sex,w_address,w_postcode,w_birthday;
dbms_output.put_line(w_name||','||w_sex||','||w_address||','||w_postcode||','||w_birthday);
exit when w_rc%notfound;
end loop;
end;
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行