SQL Разработчик не вставляет данные - PullRequest
1 голос
/ 05 мая 2020
create or replace PROCEDURE ADD_TO_BLACKLIST(
    P_EMPLOYEE_USERNAME IN VARCHAR2,
    T_CURSOR OUT SYS_REFCURSOR
    )
AS 
BEGIN
    DECLARE
        E_COUNT PLS_INTEGER := 0;
    BEGIN
        SELECT COUNT(*) INTO E_COUNT FROM EXAMPLE_TABLE
        WHERE UPPER(EMPLOYEE_USERNAME) LIKE UPPER(P_EMPLOYEE_USERNAME)||'%';

        IF E_COUNT = 0 THEN
            INSERT INTO EXAMPLE_TABLE 
            (employee_number, employee_username) 
            SELECT EMPLOYEE_NUMBER, EMAIL FROM EXAMPLE_VIEW
            WHERE UPPER(EMAIL)=CONCAT(UPPER(P_EMPLOYEE_USERNAME), '@microsoft.com');
        ELSE
            UPDATE EXAMPLE_TABLE
            SET (EMPLOYEE_NUMBER, EMPLOYEE_USERNAME) =
                (SELECT EMPLOYEE_NUMBER, EMAIL FROM EXAMPLE_VIEW
                 WHERE UPPER(EMAIL) = CONCAT(UPPER(P_EMPLOYEE_USERNAME), '@microsoft.com'));

            COMMIT;
        END IF;

        OPEN T_CURSOR For
        SELECT * FROM EXAMPLE_VIEW
        WHERE  EMAIL LIKE CONCAT(UPPER(P_EMPLOYEE_USERNAME), '%');
    END;
END ADD_TO_BLACKLIST;

Это компилируется, но когда я пытаюсь протестировать его с действительным P_EMPLOYEE_USERNAME (которое, как я подтвердил, находится в EXAMPLE_VIEW), я не вижу вставляемых данных.

Я новичок в PL SQL и не уверен, как определить значение E_COUNT

DDL Example_Table:

CREATE TABLE "Example_Table"
(   "EMPLOYEE_NUMBER" NUMBER NOT NULL ENABLE, 
    "EMPLOYEE_USERNAME" VARCHAR2(250 BYTE) NOT NULL ENABLE, 
    "ACCOUNT_STATUS" NUMBER DEFAULT 0, 
    "ACCOUNT_STATUS_LAST_UPDATE" TIMESTAMP (6) DEFAULT SYSDATE NOT NULL ENABLE, 
     CONSTRAINT "BOE_SAFEGAURD_PK" PRIMARY KEY ("EMPLOYEE_USERNAME"))

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

Проблема находится в строке ниже, вы не преобразуете регистр после конкатенации. Измените и попробуйте ниже,

 WHERE UPPER(EMAIL) = UPPER(CONCAT(UPPER(P_EMPLOYEE_USERNAME), '@microsoft.com'));

РЕДАКТИРОВАТЬ: Чтобы подтвердить теорию, пожалуйста, найдите ниже подробности.

Я протестировал это, и он работает,

DDL для создания таблиц:

CREATE TABLE Example_Table
(    EMPLOYEE_NUMBER NUMBER NOT NULL ENABLE, 
    EMPLOYEE_USERNAME VARCHAR2(250 BYTE) NOT NULL ENABLE, 
    ACCOUNT_STATUS NUMBER DEFAULT 0, 
    ACCOUNT_STATUS_LAST_UPDATE TIMESTAMP (6) DEFAULT SYSDATE NOT NULL ENABLE, 
     CONSTRAINT BOE_SAFEGAURD_PK PRIMARY KEY (EMPLOYEE_USERNAME));

CREATE TABLE Example_view
(    EMPLOYEE_NUMBER NUMBER NOT NULL ENABLE, 
    EMAIL VARCHAR2(250 BYTE) NOT NULL ENABLE, 
    ACCOUNT_STATUS NUMBER DEFAULT 0, 
    ACCOUNT_STATUS_LAST_UPDATE TIMESTAMP (6) DEFAULT SYSDATE NOT NULL ENABLE 
     );

DML для заполнения данных в example_view, которые будут использоваться для теста .

insert into example_view values(1,'Test@microsoft.com',1,sysdate);

Изменена процедура, чтобы добавить UPPER справа от соединения для условий вставки и обновления и поместить commit после завершения if. Хороший код должен иметь только одну фиксацию и это должен быть в конце выполнения перед блоком exception основного блока begin..end.

create or replace PROCEDURE ADD_TO_BLACKLIST(
P_EMPLOYEE_USERNAME IN VARCHAR2,
T_CURSOR OUT SYS_REFCURSOR
)
AS 
BEGIN
DECLARE E_COUNT PLS_INTEGER := 0;
BEGIN
    SELECT COUNT(*) INTO E_COUNT FROM EXAMPLE_TABLE WHERE UPPER(EMPLOYEE_USERNAME) LIKE UPPER(P_EMPLOYEE_USERNAME)||'%';
    IF E_COUNT = 0 THEN
        INSERT INTO EXAMPLE_TABLE 
            (employee_number, employee_username) 
            SELECT EMPLOYEE_NUMBER, EMAIL FROM EXAMPLE_VIEW WHERE UPPER(EMAIL)=UPPER(CONCAT(UPPER(P_EMPLOYEE_USERNAME), '@microsoft.com'));
    ELSE
        UPDATE EXAMPLE_TABLE SET (EMPLOYEE_NUMBER, EMPLOYEE_USERNAME) = (SELECT EMPLOYEE_NUMBER, EMAIL FROM EXAMPLE_VIEW WHERE UPPER(EMAIL)=UPPER(CONCAT(UPPER(P_EMPLOYEE_USERNAME), '@microsoft.com')));

    END IF;

   COMMIT;

    OPEN T_CURSOR For
        SELECT * FROM EXAMPLE_VIEW WHERE EMAIL LIKE CONCAT(UPPER(P_EMPLOYEE_USERNAME), '%');
END;
END ADD_TO_BLACKLIST;

В анонимном блоке, вызванном процедурой,

DECLARE
T_CURSOR  SYS_REFCURSOR;

BEGIN 
ADD_TO_BLACKLIST('test',T_CURSOR);

end;

Выполнить запрос чтобы проверить, вставлены ли записи,

select * from example_table;

Результат ниже, enter image description here

0 голосов
/ 05 мая 2020

Вам просто нужна фиксация после условия IF-ELSE, а не внутри него. Я обновил ваш код вместе с некоторыми другими незначительными обновлениями -

create or replace PROCEDURE ADD_TO_BLACKLIST( P_EMPLOYEE_USERNAME IN VARCHAR2,
                                              T_CURSOR OUT SYS_REFCURSOR
                                            )
AS
E_COUNT PLS_INTEGER := 0;
BEGIN
     SELECT COUNT(*)
       INTO E_COUNT
       FROM EXAMPLE_TABLE
      WHERE UPPER(EMPLOYEE_USERNAME) LIKE UPPER(P_EMPLOYEE_USERNAME)||'%';

     IF E_COUNT = 0 THEN
        INSERT INTO EXAMPLE_TABLE 
            (employee_number, employee_username) 
        SELECT EMPLOYEE_NUMBER, EMAIL
          FROM EXAMPLE_VIEW
         WHERE UPPER(EMAIL) = CONCAT(UPPER(P_EMPLOYEE_USERNAME), '@microsoft.com');
    ELSE
        UPDATE EXAMPLE_TABLE
           SET (EMPLOYEE_NUMBER, EMPLOYEE_USERNAME) = (SELECT EMPLOYEE_NUMBER, EMAIL
                                                         FROM EXAMPLE_VIEW
                                                        WHERE UPPER(EMAIL)=CONCAT(UPPER(P_EMPLOYEE_USERNAME), '@microsoft.com'));
    END IF;

    COMMIT;

    OPEN T_CURSOR For
        SELECT *
          FROM EXAMPLE_VIEW
         WHERE EMAIL LIKE CONCAT(UPPER(P_EMPLOYEE_USERNAME), '%');
END ADD_TO_BLACKLIST;
...