как выполнить оператор удаления внутри блока plsql и вызвать его в процедуре - PullRequest
1 голос
/ 21 ноября 2019

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

Пожалуйста, предложите, если что-то мне не хватает \

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

create or replace PROCEDURE EmployeeProc
IS 
BEGIN
delete from Employeetable where EmplId in (
select EmployeeId FROM EmployeeMstrTbl where JoiningDate between to_date('2019-01-01','YYYY-MM-DD') and to_date('2019-02-28','YYYY-MM-DD'));
commit;
DBMS_OUTPUT.PUT_LINE('Deleted '||SQL%ROWCOUNT ||' records from Employeetable');
END;

Error: Object Invalid

Ответы [ 3 ]

0 голосов
/ 22 ноября 2019

Попробуйте использовать курсор

CREATE OR REPLACE PROCEDURE EMPLOYEEPROC IS 
CURSOR C1 IS 
SELECT EMPLOYEEID 
FROM EMPLOYEEMSTRTBL 
WHERE JOININGDATE BETWEEN TO_DATE('2019-01-01','YYYY-MM-DD') AND TO_DATE('2019-02-28','YYYY-MM-DD'));
BEGIN
    FOR I IN C1 LOOP        
        DELETE FROM EMPLOYEETABLE 
        WHERE EMPLID=I.EMPLOYEEID;
    END LOOP;

    COMMIT;

    DBMS_OUTPUT.PUT_LINE('DELETED '||SQL%ROWCOUNT ||' RECORDS FROM EMPLOYEETABLE');

END;
0 голосов
/ 22 ноября 2019

Ваш код работает просто отлично.

CREATE TABLE Employeetable
(
    EmplId NUMBER
);

CREATE TABLE EmployeeMstrTbl
(
    EmployeeId NUMBER,
    JoiningDate DATE
);

CREATE OR REPLACE PROCEDURE EmployeeProc
IS
BEGIN
    DELETE FROM Employeetable
          WHERE EmplId IN
                    (SELECT EmployeeId
                       FROM EmployeeMstrTbl
                      WHERE JoiningDate BETWEEN TO_DATE ('2019-01-01',
                                                         'YYYY-MM-DD')
                                            AND TO_DATE ('2019-02-28',
                                                         'YYYY-MM-DD'));

    COMMIT;
    DBMS_OUTPUT.PUT_LINE (
        'Deleted ' || SQL%ROWCOUNT || ' records from Employeetable');
END;

EXEC EmployeeProc;

DROP TABLE Employeetable;
DROP TABLE EmployeeMstrTbl;
DROP PROCEDURE EmployeeProc;

Вывод сценария:

Table created.
Table created.
Procedure created.
 PL/SQL procedure successfully completed.
Table dropped.
Table dropped.
Procedure dropped.

Вывод СУБД:

Deleted 0 records from Employeetable

Возможно, в таблице имеется опечаткаимя, имя столбца или что-то подобное.

Я предлагаю сначала попытаться выполнить оператор удаления, чтобы проверить, работает ли он.

0 голосов
/ 21 ноября 2019

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

i = 0;
FOR r in (select * FROM EmployeeMstrTbl where JoiningDate between to_date('2019-01-01','YYYY-MM-DD') and to_date('2019-02-28','YYYY-MM-DD'))
  LOOP
  DELETE FROM Employeetable where EmplId = r.EmployeeId;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Deleted '|| i ||' records from Employeetable'); 

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

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