我有一个在 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 代码。我的问题是如何以优雅的方式处理这种情况。我有一些想法,但不知道它是否可行:
- 创建一个处理从 sp 返回的两个游标中涉及的每一列的 DataWindow 对象,然后将每一行复制到预期的 DataWindow。
- 创建一个 DataStore 并使用
Create
方法传递 sp,然后复制预期 DataWindow 中的行。 - 动态执行该过程,获取每一行并将每个结果添加到预期 DataWindow 的新行中。
第一个没试过,因为列多,做起来要花很长时间。第二个看起来不错,但我不知道如何处理没有 DataWindow 对象的 DataStore 并且不知道这是否可能(1)。第三个是我解决这个问题的最后一个选择。我想在开始实施此解决方案之前询问人们,因为我是 PowerBuilder 的新手,即使我不会在它上面工作太久,我也想以正确的方式去做。
谢谢您的帮助。
(1) 我找到了这篇关于使用自定义数据存储的文章,但我不知道我是否只能使用 1 个数据存储或者我应该使用 2 个。此外,对于 Oracle 连接,我不使用 SQLCA,而是使用另一个事务对象,所以我不知道该怎么做。