Sql 从Oracle对象(其他对象的表)读取行

Sql 从Oracle对象(其他对象的表)读取行,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,请原谅,这是我第一次尝试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)

请原谅,这是我第一次尝试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)      || ' ' 
create or replace 
TYPE ORDERS_TABLE 
IS TABLE OF ORDER_HEADER;
 tbl_ORDER_LINES       ORDER_LINES,
 tbl_ORDER_TENDERS     ORDER_TENDERS,
 TBL_ORDER_REBATES     ORDER_REBATES
我创建了几个新的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)      || ' ' 
create or replace 
TYPE ORDERS_TABLE 
IS TABLE OF ORDER_HEADER;
 tbl_ORDER_LINES       ORDER_LINES,
 tbl_ORDER_TENDERS     ORDER_TENDERS,
 TBL_ORDER_REBATES     ORDER_REBATES
这是指我的另一种类型:

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
);
例如,以订单类型为例:

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)
);
因此,我认为我的包正在工作,我可以填充这些对象(至少验证了标题内容是否工作。)但我不确定在调用此包查看是否获取订单投标/订单投标数据时如何测试/调试/查看结果

例如,这很好:

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;
但我如何看待订单投标/订单投标数据

我试着把这个额外的FOR循环放进去,但它不喜欢我所指的订单投标


我试着与outvar(I)相关。订单招标,但也没有成功。。。有什么想法吗?

问题出在调用代码中,我不应该引用子对象的新实例,我应该在传递的原始参数中引用它们的“生存状态”,如下所示:

 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)      || ' ' 
create or replace 
TYPE ORDERS_TABLE 
IS TABLE OF ORDER_HEADER;
 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;
端环; 结束