Можно ли удалить поля из текущего курсора в Oracle PL / SQL? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать массивную вставку из «временного файла», поэтому я использую курсор для изменения некоторых значений. Я добавил поле на основе столбца row_number (), чтобы получить следующий номер, созданный для каждой записи. Эта запись и мой «номер лота» будут представлять собой новое значение лота (например, для лота «Альфа» у меня будет «Альфа01», «Альфа02», «Альфа03» и т. Д.).

Но я не понимаюне знаю, как удалить этот дополнительный столбец после внесения изменений, поэтому у меня не возникает проблем с процессом вставки (в моем курсоре теперь больше столбцов, чем в исходном файле).

текущий код гласит:

SET SERVEROUTPUT ON;

DECLARE
-- Array of lot numbers & how I want to name them --
TYPE VARR_LOTN IS TABLE OF VARCHAR(8);
VAR_LOTN VARR_LOTN;
TOTAL INTEGER;
-- Application-relevant variables --
MAX_VAL NUMBER := &&Maximum_Values.;
VAR_MMCU VARCHAR(12) := '&&Branch.';
VAR_ITM NUMBER := '&&Item.';
VAR_DATE NUMBER := TO_CHAR(SYSDATE, 'YYYYDDD') - 1900000;
VAR_TIME NUMBER := TO_CHAR(SYSDATE, 'HH24MISS');
-- This section is the cursor I'm creating --
-- Note the Row_Number() aggregate function, which I want to use as counter --
CURSOR VAR_LOTN_C IS
    SELECT LPAD(ROW_NUMBER() OVER(ORDER BY IOITM), 2, 0) IOID, T1.* FROM TESTDTA.F4108 T1
    WHERE IOITM = VAR_ITM AND IOLOTS = ' ' AND TRIM(IOMCU) = VAR_MMCU AND IOMMEJ >= TO_CHAR(SYSDATE + 365, 'YYYYDDD') - 1900000 AND ROWNUM <= MAX_VAL;
-- I'm having somre trouble understanding how the %RowType attribute works, & which others are available --
VARC_LOTN VAR_LOTN_C%ROWTYPE;

BEGIN
    VAR_LOTN := VARR_LOTN('Alpha', 'Beta', 'Gamma', 'Delta');
    TOTAL := VAR_LOTN.COUNT;

    FOR T1 IN 1 .. TOTAL
        LOOP
            -- I'm fetching the cursor into the "variable" --
            OPEN VAR_LOTN_C;
                FETCH VAR_LOTN_C INTO VARC_LOTN;
            CLOSE VAR_LOTN_C;
                -- This is why I added column IOID, to have records as 'Alpha01', 'Alpha02', &c --
                VARC_LOTN.IOLOTN := T1 || VARC_LOTN.IOID;

                -- Other relevant variable changes... --
                VARC_LOTN.IODOCO := 0;
                VARC_LOTN.IODCTO := NULL;
                -- UA0
                VARC_LOTN.IOUA01 := VAR_DATE;
                VARC_LOTN.IOUA02 := 0;
                VARC_LOTN.IOUA03 := 0;
                VARC_LOTN.IOUA04 := VAR_DATE;
                VARC_LOTN.IOUA05 := 0;
                VARC_LOTN.IOUA06 := VAR_DATE;
                -- UB0
                VARC_LOTN.IOUB01 := 0;
                VARC_LOTN.IOUB02 := 0;
                VARC_LOTN.IOUB03 := 0;
                VARC_LOTN.IOUB04 := 0;
                VARC_LOTN.IOUB05 := 0;
                VARC_LOTN.IOUB06 := 0;
                -- AUDIT
                VARC_LOTN.IOUSER := 'Me';
                VARC_LOTN.IOPID := 'SQL'; 
                VARC_LOTN.IOUPMJ := VAR_DATE;
                VARC_LOTN.IOTDAY := VAR_TIME;
                -- ***In here is where I need to get rid of column IOID, so I can insert the batch I just created into the table. I cannot insert it now because this column does not exist in table F4108, I created it only for my own numbering.-*** --
                {{{ALTER TABLE VARC_LOTN DROP COLUMN IOID; or something like that...}}}

            -- Here I insert the final fetch --
            INSERT INTO TESTDTA.F4108
                VALUES VARC_LOTN;

        END LOOP;
END;

Я не вижу возможности сделать эти изменения, и другие варианты, которые приходят мне в голову, не очень удобны для пользователя (ввод всех столбцов один за другим...).

Вы знаете, возможно ли это?

Спасибо !!!

1 Ответ

1 голос
/ 24 октября 2019

Нет. Столбцы нельзя удалить из курсора во время выполнения.

Но я думаю, что вам не нужен столбец IOID в курсоре.

Используйте следующий запрос курсора:

SELECT T1.*  -- temoved row_number from here
FROM TESTDTA.F4108 T1
WHERE IOITM = VAR_ITM AND IOLOTS = ' ' 
AND TRIM(IOMCU) = VAR_MMCU AND IOMMEJ >= TO_CHAR(SYSDATE + 365, 'YYYYDDD') - 1900000 
AND ROWNUM <= MAX_VAL
ORDER BY IOITM; -- ADDED THIS order by clause

Вам нужно объявить одну локальную переменную:

LOCAL_VARIABLE NUMBER := 0;

А где используется IOID, вы можете заменить ее на:

LOCAL_VARIABLE := LOCAL_VARIABLE + 1;
VARC_LOTN.IOLOTN := T1 || LPAD(LOCAL_VARIABLE, 2, 0);

Она достигнет того же результата, что и ваш код, иТакже курсор будет свободен от лишнего столбца.

Ура !!

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