необходимо создать временную таблицу внутри моей процедуры, в которой есть курсор - PullRequest
0 голосов
/ 26 октября 2019

Код процедуры ниже :: В строке TYPE есть ошибки при компиляции. Дайте мне знать, как правильно использовать создание таблицы здесь.

CREATE OR REPLACE PROCEDURE bulk_order_export 
    (
        startdate IN       varchar2,
        enddate   IN       varchar2,
           batchsize  IN       varchar2
    )   
    IS
      bulkorderdata_cursor sys_refcursor ;
      p_query_string  VARCHAR2(100);
     TYPE FBL_BACKUP_ORDER IS TABLE OF DPS_USER%TYPE;
      temp_order_id FBL_BACKUP_ORDER;
    BEGIN

    p_query_string := 'SELECT ID FROM abc_order WHERE REGISTRATION_DATE BETWEEN :startDate AND :endDate'; 
    OPEN bulkorderdata_cursor FOR p_query_string USING startdate, enddate;
    LOOP
        FETCH bulkorderdata_cursor BULK COLLECT into temp_order_id LIMIT batchsize;  
    FORALL i IN 1..temp_order_id.count
            INSERT INTO FBL_BACKUP_ORDER VALUES(temp_order_id(i));   
    --COMMIT;
        DBMS_OUTPUT.PUT_LINE('Commit '||temp_order_id.count||' inserted rows');
     Total := Total+temp_order_id.count;
     EXIT WHEN bulkorderdata_cursor%NOTFOUND;
    END LOOP;
    CLOSE bulkorderdata_cursor;
    END;

1 Ответ

0 голосов
/ 26 октября 2019

Что касается DPS_USER% TYPE, я предполагаю, что это таблица? Если это так, то синтаксис: DPS_USER% ROWTYPE.

Затем вам нужно убедиться, что ваши переменные определены, batchsize является числовым, а затем вы разобрались с некоторым синтаксисом, и вам будет хорошо идти

SQL> create table DPS_USER ( id int );

Table created.

SQL> create table abc_order ( id int );

Table created.

SQL> create table FBL_BACKUP_ORDER ( id int );

Table created.

SQL>
SQL>
SQL> CREATE OR REPLACE PROCEDURE bulk_order_export
  2      (
  3          startdate IN       varchar2,
  4          enddate   IN       varchar2,
  5             batchsize  IN    int
  6      )
  7      IS
  8        bulkorderdata_cursor sys_refcursor ;
  9        p_query_string  VARCHAR2(100);
 10       TYPE FBL_BACKUP_ORDER IS TABLE OF DPS_USER%ROWTYPE;
 11        temp_order_id FBL_BACKUP_ORDER;
 12        total int;
 13      BEGIN
 14
 15      p_query_string := 'SELECT ID FROM abc_order WHERE REGISTRATION_DATE BETWEEN :startDate AND :endDate';
 16      OPEN bulkorderdata_cursor FOR p_query_string USING startdate, enddate;
 17      LOOP
 18          FETCH bulkorderdata_cursor BULK COLLECT into temp_order_id LIMIT batchsize;
 19      FORALL i IN 1..temp_order_id.count
 20              INSERT INTO FBL_BACKUP_ORDER VALUES temp_order_id(i);
 21      --COMMIT;
 22          DBMS_OUTPUT.PUT_LINE('Commit '||temp_order_id.count||' inserted rows');
 23       Total := Total+temp_order_id.count;
 24       EXIT WHEN bulkorderdata_cursor%NOTFOUND;
 25      END LOOP;
 26      CLOSE bulkorderdata_cursor;
 27      END;
 28  /

Procedure created.
...