我有一个在Oracle 9g中创建的存储过程,它根据参数返回一个具有不同列的游标,如下所示:
CREATE OR REPLACE PROCEDURE ASCHEMA.SP_TWOCURSORS
(
aParam NUMBER,
P_RETURN OUT SYS_REFCURSOR
)
IS
BEGIN
IF aParam = 1 THEN
OPEN P_RETURN FOR
SELECT
a.column1, (number)
a.column2 (varchar2)
FROM
table1 a;
ELSE
OPEN P_RETURN FOR
SELECT
b.column1, (varchar2)
b.column2, (number)
b.column3 (number)
FROM
table1 b;
END IF;
END;
我必须在PowerBuilder中使用此过程并将返回的数据传递给DataWindow1或DataWindow2,具体取决于返回的游标,这些数据窗口在运行时通过执行来自其他源的其他过程填充。我无法修改数据库对象(比如将sp分成两部分),只需修改PowerBuilder代码。我的问题是如何以优雅的方式处理这种情况。我有一些想法,但不知道它是否会起作用:
Create
方法传递sp,然后复制预期的DataWindow中的行。我没有尝试过第一个,因为有很多列,需要很长时间才能完成。第二个看起来不错,但我不知道如何处理没有DataWindow对象的DataStore,也不知道这是否可能(1)。第三个是我解决这个问题的最后一个选择。我想在开始实施这个解决方案之前先问问一下,因为我是PowerBuilder的新手,即使我不能长时间工作,我也希望以正确的方式做到这一点。
感谢您的帮助。
(1)我发现这篇文章关于使用Custom DataStores,但我不知道我是否只能使用1个DataStore,或者我应该使用2.另外,对于Oracle连接,我不使用SQLCA但是另一个事务对象,所以我不知道该怎么做。
答案 0 :(得分:1)
保持简单。
您知道存储过程的详细信息。如果从PB调用此sp,则在调用之前已知道其aParam
。为什么不定义2个数据窗口,每个版本的结果一个?
每个DW都有一个检索参数(传递给存储过程的参数),并从sp获得结果。
在运行时,根据检索参数,在检索值之前,将相应的dataobject
分配给打开的数据窗口对象:适合aParam = 1
的DW或适合的DW else
部分。