如何处理返回2个不同结果的过程

时间:2012-08-14 23:03:59

标签: oracle powerbuilder

我有一个在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. 创建一个DataWindow对象,该对象处理从sp返回的两个游标中涉及的每个列,然后将每一行复制到预期的DataWindow。
  2. 创建一个DataStore并使用Create方法传递sp,然后复制预期的DataWindow中的行。
  3. 动态执行该过程,获取每一行并将每个结果添加到预期DataWindow的新行中。
  4. 我没有尝试过第一个,因为有很多列,需要很长时间才能完成。第二个看起来不错,但我不知道如何处理没有DataWindow对象的DataStore,也不知道这是否可能(1)。第三个是我解决这个问题的最后一个选择。我想在开始实施这个解决方案之前先问问一下,因为我是PowerBuilder的新手,即使我不能长时间工作,我也希望以正确的方式做到这一点。

    感谢您的帮助。

    (1)我发现这篇文章关于使用Custom DataStores,但我不知道我是否只能使用1个DataStore,或者我应该使用2.另外,对于Oracle连接,我不使用SQLCA但是另一个事务对象,所以我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

保持简单。

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

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

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