oracle存储过程作为pb的数据窗口的数据源的问题!

tjm1 2003-05-19 11:46:20
1,
在sqlserver的存储过程中,当对一个表进行处理完毕后,在存储过程的最后:select * from table;
然后数据窗口就可以以这个存储过程为数据源,
但是oracle的存储过程不支持select * from table,有什么好办法能在oracle的存储过程里实现同sqlserver一样的功能,或者有没有别的办法。


2,
csdn给我的邮箱发了很多期刊:ldmsapp,下载完了怎么看啊。
...全文
33 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tjm1 2003-05-19
to: newskysoft(阿乌), 你那个帖子标题是什么?
回复
tjm1 2003-05-19
多谢!~
回复
newskysoft 2003-05-19
这个问题曾经困扰我一段时间,直到后来我看到下面这个例子,问题才得以解决。不过很遗憾的告诉你,oracle中使用storeproduce远没有sqlserver那么简单易用。而且8i以前的版本不支持临时表,8i以后的虽然支持临时表但是它的临时表概念和sqlserver完全不同,并且你不可以在storeproduce里使用create table语句。我建议你如果不是非常必要就不要在oracle里拿存储过程做dw的数据源了。我曾经在网易广州pb论坛里发过完整的pb调oracle 存储过程做dw数据源的例子,如果有兴趣你可以去查找。由于被网易某个X人封杀全区发言权所以我现在很少去

create or replace package pkg_emp
as
type emptyp is record(
empno number(4),
ename varchar2(10),
sal number(7,2),
deptno number(2));

type v_emp_dept is ref cursor return emptyp; ---據說這個類型可以讓前端(pb)接收得到,但我沒試過,你試試吧.

type v_emp_job is table of emptyp index by binary_integer;
end;

CREATE OR REPLACE PROCEDURE EM_PERLIST
( fact IN VARCHAR,
day IN VARCHAR,
day_type IN VARCHAR,
brn_beg IN VARCHAR,
brn_end IN VARCHAR,
PER_CUR IN OUT EM_PERPKG.PerCurTyp)
AS
v_CursorID INTEGER;
v_Select VARCHAR2(1000);
v_Processed INTEGER;
v_SessionID VARCHAR2(12) := dbms_session.unique_session_id;
type_temp CHAR(20);
v_pnl_no EM_PERWK.PNL_NO%TYPE;
BEGIN
type_temp := 'WK_TYPE' || LTRIM(SUBSTR(day,7,2),'0');
v_CursorID := dbms_sql.open_cursor;
v_Select := 'SELECT EM_PERWK.PNL_NO FROM EM_PERWK,EM_PNL WHERE EM_PERWK.FACT_NO = EM_PNL.FACT_NO AND EM_PERWK.PNL_NO = EM_PNL.PNL_NO AND ' ||
'BRANCH_NO >= :a AND BRANCH_NO <= :b AND ' ||
'EM_PERWK.FACT_NO = :x AND CARD_YM = :y AND ' || type_temp || ' = :z';

dbms_sql.parse(v_CursorID,v_Select,dbms_sql.v7);
dbms_sql.bind_variable(v_CursorID,':a',brn_beg);
dbms_sql.bind_variable(v_CursorID,':b',brn_end);
dbms_sql.bind_variable(v_CursorID,':x',fact);
dbms_sql.bind_variable(v_CursorID,':y',SUBSTR(day,1,6));
dbms_sql.bind_variable(v_CursorID,':z',day_type);
dbms_sql.define_column(v_CursorID,1,v_pnl_no,8);

v_Processed := dbms_sql.execute(v_CursorID);

LOOP
IF dbms_sql.fetch_rows(v_CursorID) = 0 THEN
EXIT;
END IF;
dbms_sql.column_value(v_CursorID,1,v_pnl_no);
INSERT INTO EM_PERTMP VALUES (v_SessionID,day,day_type,fact,v_pnl_no);
END LOOP;
dbms_sql.close_cursor(v_CursorID);

OPEN PER_CUR FOR
SELECT CARD_D,TYPE,EM_PNL.FACT_NO,FACT_NM,EM_PNL.PNL_NO,PNL_NM,EM_PNL.BRANCH_NO,BRANCH_NM
FROM EM_PNL,EM_FACT,EM_BRANCH,EM_PERTMP
WHERE EM_PERTMP.SESSION_ID = v_SessionID AND
EM_PERTMP.FACT_NO = EM_PNL.FACT_NO AND
EM_PERTMP.PNL_NO = EM_PNL.PNL_NO AND
EM_PNL.FACT_NO = EM_FACT.FACT_NO AND
EM_PNL.BRANCH_NO = EM_BRANCH.BRANCH_NO;

DELETE EM_PERTMP WHERE SESSION_ID = v_SessionID;
COMMIT;

EXCEPTION
WHEN OTHERS THEN
dbms_sql.close_cursor(v_CursorID);
RAISE;
END EM_PERLIST;
回复
tjm1 2003-05-19
up
回复
tjm1 2003-05-19
select a, b, c into aa, bb, cc from table这样也不行,只能查找到一条记录,
如果sqlserver的话, select a, b, c from table就不成问题。
回复
Thinkinger 2003-05-19
如果你用存储过程做数据源的话,你是不能用select * ……方式从服务器端返回数据集的,你要显式的列出各个列名
回复
tjm1 2003-05-19
搜索一些帖子,确实没有好的办法。
回复
相关推荐
发帖
PowerBuilder
创建于2007-09-28

869

社区成员

PowerBuilder 相关问题讨论
申请成为版主
帖子事件
创建了帖子
2003-05-19 11:46
社区公告
暂无公告