2013-08-30 42 views
0

原谅我,这是我第一次尝试Oracle包,所以我希望能够简单地忽略一些东西。从Oracle对象读取其他对象表中的行

编辑我整理吧... 需要参考实际的声明子类型,例如:

FOR j in outvar(i).tbl_ORDER_TENDERS.first..outvar(i).tbl_ORDER_TENDERS.last LOOP 
     DBMS_OUTPUT.PUT_LINE('tender record : ' 
     || to_char(outvar(i).tbl_ORDER_TENDERS(j).TENDER_AMT)  || ' ' 

我创建了几个几个新的Oracle类型,将从持有行数据我DB,因为这样的:

create or replace 
TYPE ORDERS_TABLE 
IS TABLE OF ORDER_HEADER; 

这指的是我的其他类型:

create or replace 
TYPE ORDER_HEADER FORCE 
AS OBJECT (
    TRANSACTION_NUMBER VARCHAR2(20), 
    LOCATION_NUMBER  VARCHAR2(10), 
    TERMINAL_NAME   VARCHAR2(25),  
    START_DATETIME  TIMESTAMP(6), 
    GROSS_SALES_AMOUNT NUMBER(20,0), 
    NET_SALES_AMOUNT  NUMBER(20,0), 
    SAVINGS_AMOUNT  NUMBER(20,0), 
    SAVINGS_PRECISION  NUMBER(6,0), 
    TOTAL_TAX    NUMBER(20,0), 
    CUSTOMER_IDENTIFIER VARCHAR2(50), 
    tbl_ORDER_LINES  ORDER_LINES, 
    tbl_ORDER_TENDERS  ORDER_TENDERS, 
    TBL_ORDER_REBATES  ORDER_REBATES 
); 

而且例如,采取ORDER_TENDERS类型:

create or replace 
TYPE ORDER_TENDERS FORCE 
AS TABLE OF ORDER_TENDER; 

其中包含招标的数据行:

create or replace 
TYPE ORDER_TENDER AS OBJECT 
( 
    TENDER_LINE_ID   NUMBER(20,0), 
    TENDER_CODE    VARCHAR2(10), 
    TENDER_AMT    NUMBER(20,0), 
    UNENCODED_ACCOUNT_NUMBER VARCHAR2(25) 
); 

所以我的包,我认为是工作,在那里我可以填补这些对象(验证)但是我不确定如何在调用这个包来查看我是否获取ORDER_TENDER/ORDER_TENDERS数据时如何测试/调试/查看结果...

例如,正常工作:

declare 
invar varchar2(5); 
outvar ORDERS_TABLE; 
O_ORDER_TENDERS ORDER_TENDERS; 
O_ORDER_TENDER ORDER_TENDER; 
begin 
sales_trickler.GetSales(invar, outvar); 

FOR i in 1..outvar.COUNT LOOP 
     DBMS_OUTPUT.PUT_LINE(' record : ' 
     || to_char(outvar(i).TRANSACTION_NUMBER)  || ' ' 
     || to_char(outvar(i).LOCATION_NUMBER)   || ' ' 
     || to_char(outvar(i).TERMINAL_NAME)   || ' ' 
     || to_char(outvar(i).CUSTOMER_IDENTIFIER)); 

    END LOOP; 
end; 

但是,如何查看ORDER_TENDERS/ORDER_TENDER数据?

我试图把这个额外的中循环,但它不喜欢我怎么指ORDER_TENDER(S)...

declare 
invar varchar2(5); 
outvar ORDERS_TABLE; 
O_ORDER_TENDERS ORDER_TENDERS; 
O_ORDER_TENDER ORDER_TENDER; 
begin 
sales_trickler.GetSales(invar, outvar); 

FOR i in 1..outvar.COUNT LOOP 
     DBMS_OUTPUT.PUT_LINE(' record : ' 
     || to_char(outvar(i).TRANSACTION_NUMBER)  || ' ' 
     || to_char(outvar(i).LOCATION_NUMBER)   || ' ' 
     || to_char(outvar(i).TERMINAL_NAME)   || ' ' 
     || to_char(outvar(i).CUSTOMER_IDENTIFIER)); 
     FOR j in 1..outvar(i).O_ORDER_TENDERS.COUNT LOOP 
     DBMS_OUTPUT.PUT_LINE('tender record : ' 
     || to_char(O_ORDER_TENDERS(j).TENDER_AMT)  || ' '   
    ); 
     END LOOP; 

    END LOOP; 
end; 

我试图与outvar(I).ORDER_TENDERS但那也没用......任何想法?

回答

0

的问题是在调用代码中,我不应该指的是子对象的新实例,我应该称它们“因为它们生活”中传递的原始参数,因为这样的:

tbl_ORDER_LINES  ORDER_LINES, 
tbl_ORDER_TENDERS  ORDER_TENDERS, 
TBL_ORDER_REBATES  ORDER_REBATES 

这里的实际语句:

declare 
invar varchar2(5); 
outvar ORDERS_TABLE; 
begin 
sales_trickler.GetSales(invar, outvar); 

FOR i in 1..outvar.COUNT LOOP 
     DBMS_OUTPUT.PUT_LINE(' record : ' 
     || to_char(outvar(i).TRANSACTION_NUMBER)  || ' ' 
     || to_char(outvar(i).LOCATION_NUMBER)   || ' ' 
     || to_char(outvar(i).TERMINAL_NAME)   || ' ' 
     || to_char(outvar(i).CUSTOMER_IDENTIFIER)); 

     FOR j in outvar(i).tbl_ORDER_TENDERS.first..outvar(i).tbl_ORDER_TENDERS.last LOOP 
     DBMS_OUTPUT.PUT_LINE('tender record : ' 
     || to_char(outvar(i).tbl_ORDER_TENDERS(j).TENDER_AMT)  || ' ' 

); 
    END LOOP; 
    --lines 
    FOR j in outvar(i).tbl_ORDER_LINES.first..outvar(i).tbl_ORDER_LINES.last LOOP 
    DBMS_OUTPUT.PUT_LINE('line record : ' 
    || to_char(outvar(i).tbl_ORDER_LINES(j).SKU)  || ' ' 

); 
    END LOOP; 

END LOOP; 结束;