如何在plsql中调用对象记录表?

问题描述 投票:0回答:1

这是主要的 T_POS_TRN_REC 对象定义

create or replace 
TYPE T_POS_TRN_REC AS OBJECT 
(
    TRANS_HEADER T_POS_TRN_HEADER_REC,
    TRANS_DETAILS T_POS_TRN_DETAIL_TBL
    --TENDERS T_POS_TRN_TNDR_TBL 
)

TYPE T_POS_TRN_HEADER_REC定义

create or replace 
TYPE T_POS_TRN_HEADER_REC AS OBJECT 
( 
SEQUENCE_ID NUMBER,
TRAN_SEQ_NO NUMBER(20),
BUSINESS_DATE   TIMESTAMP,
LOCATION_NO NUMBER(10),
TRANSACTION_DATE    TIMESTAMP,
REGISTER NUMBER,
TRAN_NO NUMBER(10),
CASHIER VARCHAR2(10),
SALESPERSON VARCHAR2(20 BYTE),
TRAN_TYPE   VARCHAR2(6),
SUB_TRAN_TYPE   VARCHAR2(6),
ORIG_TRAN_NO    NUMBER(10),
ORIG_TRAN_TYPE  VARCHAR2(6),
ORIG_REG_NO VARCHAR2(5),
REF_NO1 VARCHAR2(30),
REF_NO2 VARCHAR2(30),
REF_NO3 VARCHAR2(30),
REF_NO4 VARCHAR2(30),
REASON_CODE VARCHAR2(6),
VENDOR_NO   VARCHAR2(10),
VENDOR_INVC_NO  VARCHAR2(30),
PAYMENT_REF_NO  VARCHAR2(16),
PROOF_OF_DELIVERY_NO    VARCHAR2(30),
STATUS  VARCHAR2(6),
VALUE_SIGN  VARCHAR2(1),
VALUE   NUMBER(20,4),
BANNER_ID   NUMBER(4),
POS_TRAN_IND    VARCHAR2(1),
ROUNDED_AMT_SIGN    VARCHAR2(1),
ROUNDED_OFF_SIGN    VARCHAR2(1),
ROUNDED_AMT NUMBER(20,4),
INCREMENT_ID VARCHAR2(30),
REF_NO26    VARCHAR2(30),
REF_NO27    VARCHAR2(30),
RTLOG_ORIG_SYS  VARCHAR2(3),
TRAN_PROCESS_SYS    VARCHAR2(3)
);

T_POS_TRN_DETAIL_TBL 类型对象定义

create or replace 
TYPE T_POS_TRN_DETAIL_TBL 
AS
  TABLE OF T_POS_TRN_DETAIL_REC;

T_POS_TRN_DETAIL_REC类型对象

--------------------------------

create or replace 
TYPE T_POS_TRN_DETAIL_REC AS OBJECT 
( 
SEQUENCE_ID   NUMBER,
TRAN_SEQ_NO   NUMBER(20),
TRAN_NO       NUMBER(10),
ITEM_SEQ_NO   NUMBER(4),
ITEM_STATUS   VARCHAR2(6),
ITEM_TYPE     VARCHAR2(6),
ITEM          VARCHAR2(25),
REF_ITEM      VARCHAR2(25),
NON_MERCH_ITEM    VARCHAR2(25),
VOUCHER_NO      VARCHAR2(25),
QTY             NUMBER(12,4),
UNIT_RETAIL     NUMBER(20,4),
SELLING_UOM     VARCHAR2(4),
TAX_IND VARCHAR2(1),
ITEM_SWIPED_IND  VARCHAR2(1),
DROP_SHIP_IND    VARCHAR2(1),
RETURN_REASON_CODE   VARCHAR2(6),
CUSTOMER_ORDER_LINE_NO   NUMBER(6),
UNIT_RETAIL_VAT_INCL     VARCHAR2(1),
TOTAL_IGTAX_AMT   NUMBER(20,4),
CUST_ORDER_NO    VARCHAR2(48),
CUST_ORDER_DATE  DATE,
FULFILL_ORDER_NO    VARCHAR2(48),
NO_INV_RET_IND      VARCHAR2(1),
RETURN_WH         NUMBER(10),
SALES_TYPE        VARCHAR2(1),
RETURN_DISPOSITION     VARCHAR2(10),
REF_NO5       VARCHAR2(30),
REF_NO6       VARCHAR2(30),
REF_NO7       VARCHAR2(30),
REF_NO8       VARCHAR2(30)
)

我定义了用于测试上述表类型对象记录的块

DECLARE o_message VARCHAR2(1000);
TRANS_DETAILS t_pos_trn_detail_tbl  := t_pos_trn_detail_tbl(t_pos_trn_detail_rec(3,334 ,000341 ,1 ,'ORI' ,'NMITEM' ,'100264317' ,null ,'55555555' ,null ,1 ,89.9 ,'E' ,'Y' ,'Y' ,'Y' ,'RET2' ,908869 ,'N' ,14.38 ,'000035' ,sysdate ,null ,null ,2 ,null ,null ,'5' ,'6' ,'7' ,'8'));

RETURN_ INTEGER;    
BEGIN
RETURN_ :=write(o_message,T_POS_TRN_REC(TRANS_DETAILS));
DBMS_OUTPUT.PUT_LINE('RETURN_'||RETURN_);
DBMS_OUTPUT.PUT_LINE('o_message'||o_message);
END;

我在上面的测试中遇到错误,记录通过包过程将数据插入表中-

    Error report:
ORA-06550: line 7, column 76:
PLS-00306: wrong number or types of arguments in call to 'T_POS_TRN_REC'
ORA-06550: line 7, column 1:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

有什么替代表类型记录的方法吗?

sql oracle plsql record object-type
1个回答
0
投票

您将类型定义为:

CREATE TYPE T_POS_TRN_REC AS OBJECT 
(
    TRANS_HEADER T_POS_TRN_HEADER_REC,
    TRANS_DETAILS T_POS_TRN_DETAIL_TBL
    --TENDERS T_POS_TRN_TNDR_TBL 
);

它有两个属性。

在 PL/SQL 块中,有以下行:

RETURN_ :=write(o_message,T_POS_TRN_REC(TRANS_DETAILS));

仅使用单个参数实例化

T_POS_TRN_REC
。您缺少
TRANS_HEADER
参数。

© www.soinside.com 2019 - 2024. All rights reserved.