0

我有一个在 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 代码。我的问题是如何以优雅的方式处理这种情况。我有一些想法,但不知道它是否可行:

  1. 创建一个处理从 sp 返回的两个游标中涉及的每一列的 DataWindow 对象,然后将每一行复制到预期的 DataWindow。
  2. 创建一个 DataStore 并使用Create方法传递 sp,然后复制预期 DataWindow 中的行。
  3. 动态执行该过程,获取每一行并将每个结果添加到预期 DataWindow 的新行中。

第一个没试过,因为列多,做起来要花很长时间。第二个看起来不错,但我不知道如何处理没有 DataWindow 对象的 DataStore 并且不知道这是否可能(1)。第三个是我解决这个问题的最后一个选择。我想在开始实施此解决方案之前询问人们,因为我是 PowerBuilder 的新手,即使我不会在它上面工作太久,我也想以正确的方式去做。

谢谢您的帮助。

(1) 我找到了这篇关于使用自定义数据存储的文章,但我不知道我是否只能使用 1 个数据存储或者我应该使用 2 个。此外,对于 Oracle 连接,我不使用 SQLCA,而是使用另一个事务对象,所以我不知道该怎么做。

4

1 回答 1

1

把事情简单化。

您知道存储过程的详细信息。如果你从 PB 调用这个 sp,你aParam在调用之前就已经知道它了。为什么不定义 2 个数据窗口,每个版本的结果一个?

每个 DW 都会有一个检索参数(传递给存储过程的那个),并将从 sp 中获取其结果。

在运行时,根据检索参数,在检索值之前,将对应dataobject的数据分配给 on 的数据窗口对象:适合该部分aParam = 1的 DW 或适合该else部分的 DW。

于 2012-08-15T20:27:33.527 回答