以下是我创建表对象的代码:
TYPE TempObjectsTable IS TABLE OF t_temp_objects%ROWTYPE
INDEX BY BINARY_INTEGER;
nt_scb_temp_objects TempObjectsTable;
t_temp_objects定义了以下列:
Name Null? Type
-------------- ----- -------------
INVC_REF NUMBER
ORDERS NUMBER
ORDER_POS_TYPE NUMBER
RULE_CONDITION VARCHAR2(500)
CHARGE NUMBER
CURRENCY VARCHAR2(10)
TXN_DT DATE
现在,我有一个游标,它返回一个订单列表,基本上是数字。
CURSOR c_orders_frm_grp IS
select a.ordr_id from sa_order a
WHERE a.invc_ref is NULL
我正在尝试使用批量收集将这些添加到上面创建的nt_scb_temp_objects
的plsql表中。但是我现在想将nt_scb_temp_objects
的其余列填充为null
,因为我将在接下来的步骤中填充这些列。
目前这是我正在尝试的。
IF c_orders_frm_grp %ISOPEN THEN
CLOSE c_orders_frm_grp ;
END IF;
OPEN c_orders_frm_grp;
FETCH c_orders_frm_grp BULK COLLECT INTO nt_scb_temp_objects.orders;
CLOSE c_orders_frm_grp;
这是我得到的错误:Error(44,74): PLS-00302: component 'ORDERS' must be declared
答案 0 :(得分:1)
您不希望使用CURSOR
和OPEN..FETCH
构造。只需运行SELECT BULK COLLECT INTO
该集合。
DECLARE
TYPE TempObjectsTable IS TABLE OF t_temp_objects%ROWTYPE
INDEX BY BINARY_INTEGER;
nt_scb_temp_objects TempObjectsTable;
BEGIN
select a.ordr_id as ORDERS,
null as INVC_REF,
null as ORDER_POS_TYPE,
null as RULE_CONDITION,
null as CHARGE,
null as CURRENCY,
null as TXN_DT
BULK COLLECT INTO nt_scb_temp_objects from sa_order a
WHERE a.invc_ref is NULL ;
END;
/
答案 1 :(得分:0)
为什么不使用INSERT INTO ... SELECT
,而只指定您现在要填充的单列:
INSERT INTO TempObjectsTable(ORDERS)
SELECT ordr_id
FROM sa_order
WHERE invc_ref IS NULL;
通常,应避免使用游标,因为大多数SQL中的常规数据库操作已基于设置。
注意:如果临时表TempObjectsTable
不存在,则必须创建它。