PLSQL: вставить результат из курсора в один столбец таблицы plsql - PullRequest
0 голосов
/ 20 марта 2019

Ниже приведен мой код Для создания объекта таблицы:

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

Я пытаюсь добавить их в таблицу plsql, созданную выше nt_scb_temp_objects с помощью массового сбора.Но сейчас я хочу, чтобы остальные столбцы 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

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Вы не хотите, чтобы конструкции 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;
/

DEMO

0 голосов
/ 20 марта 2019

Почему бы не использовать INSERT INTO ... SELECT, а указать только один столбец, который вы хотите заполнить сейчас:

INSERT INTO TempObjectsTable(ORDERS)
SELECT ordr_id
FROM sa_order
WHERE invc_ref IS NULL;

Как правило, следует избегать использования курсоров, поскольку большинство обычных операций с базами данных в SQL уже установлены на основе.

Примечание. Если временная таблица TempObjectsTable еще не существует, вам придется ее создать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...