PL SQL "Тип массива" К переводу TSQL - PullRequest
0 голосов
/ 06 мая 2019

Это мой начальный код PL / SQL:

    TYPE VarcharArray IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;

, и я использую его в следующем коде:

 PROCEDURE Create(inFatherId IN VARCHAR2, inBarcode IN VarcharArray, inItemId IN VarcharArray)
 IS
    myCount NUMBER(38);
    sampleId_FromDb NUMBER(38);
    itemId_FromDb NUMBER(38);
 BEGIN
    myCount := inBarcode.COUNT;
    FOR i IN 1..myCount
    LOOP
        SELECT ITEM.Id INTO itemId_FromDb FROM ITEM WHERE FatherId = inFatherId AND CampaignItemId = inItemId(i);
        SELECT SAMPLE_SEQUENCE.NEXTVAL INTO sampleId_FromDb FROM DUAL;
        INSERT INTO CAMPAIGN_SAMPLES(Id, Barcode, ItemId) VALUES(sampleId_FromDb, inBarcode(i), itemId_FromDb);
    END LOOP;
 END;

Я видел, что тип массива может быть переведенв MS SQL с табличными параметрами, однако как я могу выполнить итерацию подобным образом, чтобы включить в итерацию те операции?

В текущей реализации PL / SQL я отправляю до 50 000 элементов вмассив и производительность приличная.Я хотел бы что-то подобное и в MS SQL.

1 Ответ

1 голос
/ 06 мая 2019

Нет необходимости зацикливаться и вставлять по одной строке за раз.Это просто способ замедлить ваш код.Поскольку таблицы не имеют какого-либо порядка в них, вам необходимо добавить один столбец, чтобы определить порядок.Ваш тип будет выглядеть следующим образом:

CREATE TYPE VarcharArray AS TABLE(ID int, Item VARCHAR(100));

Затем вы можете переписать вашу процедуру как один оператор INSERT.

CREATE PROCEDURE SomeProcedure(
    @FatherId AS VARCHAR, --This might need a length or will be defaulted to length 1
    @Barcode  AS VarcharArray READONLY, 
    @ItemId   AS VarcharArray READONLY
)
AS
    INSERT INTO CAMPAIGN_SAMPLES(Id, Barcode, ItemId) 
    SELECT NEXT VALUE FOR SAMPLE_SEQUENCE,
        bc.Item,
        i.Id 
    FROM ITEM i
    JOIN @ItemId ii ON i.CampaignItemId = ii.Item
    JOIN @Barcode bc ON ii.ID = bc.ID
    WHERE i.FatherId = @FatherId;

Вы также можете создать таблицу с обоими значениями и предотвратить любыепроблемы с заказом, которые могут возникнуть.

CREATE TYPE BarcodeItems AS TABLE(Item VARCHAR(100), Barcode VARCHAR(100));

GO
CREATE PROCEDURE SomeProcedure(
    @FatherId AS VARCHAR, --This might need a length or will be defaulted to length 1
    @BarcodeItems  AS BarcodeItems READONLY
)
AS
    INSERT INTO CAMPAIGN_SAMPLES(Id, Barcode, ItemId) 
    SELECT NEXT VALUE FOR SAMPLE_SEQUENCE,
        bi.Item,
        i.Id 
    FROM ITEM i
    JOIN @BarcodeItems bi ON i.CampaignItemId = bi.Item
    WHERE i.FatherId = @FatherId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...