通过ID列表的PL SQL循环

通过ID列表的PL SQL循环,sql,oracle,plsql,oracle-sqldeveloper,plsqldeveloper,Sql,Oracle,Plsql,Oracle Sqldeveloper,Plsqldeveloper,我有一张名单 约翰,萨姆,彼得,杰克 我想用上面的每一个作为过滤器查询相同的sql。每个查询都会给我一个唯一的员工id,我想用它来删除一些其他记录 select emp_id from employee where emp_name like '%john%'; 假设对于第一个查询,我得到的id是1001。因此,删除查询如下所示 delete from account_details where emp_id = 1001; delete from hr_details where emp_i

我有一张名单

约翰,萨姆,彼得,杰克

我想用上面的每一个作为过滤器查询相同的sql。每个查询都会给我一个唯一的员工id,我想用它来删除一些其他记录

select emp_id from employee where emp_name like '%john%';
假设对于第一个查询,我得到的id是1001。因此,删除查询如下所示

delete from account_details where emp_id = 1001;
delete from hr_details where emp_id = 1001;
delete from pay_role_details where emp_id = 1001;
var emp_list = ['john', 'jack', 'kate', 'peter', 'sam',...]

for each :employee_name in emp_list
    select emp_id as :var_emp_id from employee where emp_name like '%:employee_name%'; 

    delete from account_details where emp_id = :var_emp_id;
    delete from hr_details where emp_id = :var_emp_id;
    delete from pay_role_details where emp_id = :var_emp_id;
end loop
set serveroutput on;
begin
loop x in ('john','jack', 'kate') loop as :name
  select emp_id as var_emp_id from employee where emp_name like '%:name%';
  // delete queries  
end loop;
end;
我必须对一份员工名单重复这一点。伪代码如下所示

delete from account_details where emp_id = 1001;
delete from hr_details where emp_id = 1001;
delete from pay_role_details where emp_id = 1001;
var emp_list = ['john', 'jack', 'kate', 'peter', 'sam',...]

for each :employee_name in emp_list
    select emp_id as :var_emp_id from employee where emp_name like '%:employee_name%'; 

    delete from account_details where emp_id = :var_emp_id;
    delete from hr_details where emp_id = :var_emp_id;
    delete from pay_role_details where emp_id = :var_emp_id;
end loop
set serveroutput on;
begin
loop x in ('john','jack', 'kate') loop as :name
  select emp_id as var_emp_id from employee where emp_name like '%:name%';
  // delete queries  
end loop;
end;
我需要一个PL-SQL查询来实现这一点。请帮忙。谢谢

我所尝试的是如下所示

delete from account_details where emp_id = 1001;
delete from hr_details where emp_id = 1001;
delete from pay_role_details where emp_id = 1001;
var emp_list = ['john', 'jack', 'kate', 'peter', 'sam',...]

for each :employee_name in emp_list
    select emp_id as :var_emp_id from employee where emp_name like '%:employee_name%'; 

    delete from account_details where emp_id = :var_emp_id;
    delete from hr_details where emp_id = :var_emp_id;
    delete from pay_role_details where emp_id = :var_emp_id;
end loop
set serveroutput on;
begin
loop x in ('john','jack', 'kate') loop as :name
  select emp_id as var_emp_id from employee where emp_name like '%:name%';
  // delete queries  
end loop;
end;

注意:尽管根据问题,如查询可能会导致多个记录,但在实际场景中,保证只有一个记录。我之所以使用like,是因为在实际场景中,它是一个参考号列表,而不是名称。参考号有一些其他的前文本和后文本,我的逗号分隔列表只有数字

使用PL/SQL游标选择要删除的所有ID,然后循环它,每次传递时发出delete语句

有关游标的详细信息可在此处找到:

有关动态SQL,请参见此处:

代码示例:

    PROCEDURE delete_stuff
    IS

    id AS NUMBER;

    CURSOR your_cursor IS
    SELECT emp_id FROM employee WHERE CONTAINS(employee.emp_name, '"John" OR "Sam" OR "Max"', 1) > 0;

    OPEN your_cursor;
        LOOP
        FETCH your_cursor INTO id;
        EXIT WHEN your_cursor%NOTFOUND;

        EXECUTE IMMEDIATE 'DELETE FROM account_details WHERE emp_id = :id' USING id;
        EXECUTE IMMEDIATE 'DELETE FROM hr_details WHERE emp_id = :id' USING id;
        EXECUTE IMMEDIATE 'DELETE FROM pay_role_details WHERE emp_id = :id' USING id;

    CLOSE your_cursor;
    END LOOP;

    EXCEPTION 
    WHEN OTHERS THEN NULL;


END delete_stuff;

使用PL/SQL游标选择要删除的所有ID,然后循环它并在每次传递时发出delete语句

有关游标的详细信息可在此处找到:

有关动态SQL,请参见此处:

代码示例:

    PROCEDURE delete_stuff
    IS

    id AS NUMBER;

    CURSOR your_cursor IS
    SELECT emp_id FROM employee WHERE CONTAINS(employee.emp_name, '"John" OR "Sam" OR "Max"', 1) > 0;

    OPEN your_cursor;
        LOOP
        FETCH your_cursor INTO id;
        EXIT WHEN your_cursor%NOTFOUND;

        EXECUTE IMMEDIATE 'DELETE FROM account_details WHERE emp_id = :id' USING id;
        EXECUTE IMMEDIATE 'DELETE FROM hr_details WHERE emp_id = :id' USING id;
        EXECUTE IMMEDIATE 'DELETE FROM pay_role_details WHERE emp_id = :id' USING id;

    CLOSE your_cursor;
    END LOOP;

    EXCEPTION 
    WHEN OTHERS THEN NULL;


END delete_stuff;

您真的需要一个光标来执行此操作吗?如果可能,请尝试跳过光标,以避免在处理大量数据时性能/内存使用不佳

delete from account_details inner join employee on account_details.emp_id = employee.emp_id where WHERE CONTAINS(employee.emp_name, '"John" OR "Sam" OR "Max"', 1) >0;

delete from hr_details inner join employee on hr_details.emp_id = employee.emp_id where WHERE CONTAINS(employee.emp_name, '"John" OR "Sam" OR "Max"', 1) >0;

delete from pay_role_details inner join employee on pay_role_details.emp_id = employee.emp_id where WHERE CONTAINS(employee.emp_name, '"John" OR "Sam" OR "Max"', 1) >0;

您真的需要一个光标来执行此操作吗?如果可能,请尝试跳过光标,以避免在处理大量数据时性能/内存使用不佳

delete from account_details inner join employee on account_details.emp_id = employee.emp_id where WHERE CONTAINS(employee.emp_name, '"John" OR "Sam" OR "Max"', 1) >0;

delete from hr_details inner join employee on hr_details.emp_id = employee.emp_id where WHERE CONTAINS(employee.emp_name, '"John" OR "Sam" OR "Max"', 1) >0;

delete from pay_role_details inner join employee on pay_role_details.emp_id = employee.emp_id where WHERE CONTAINS(employee.emp_name, '"John" OR "Sam" OR "Max"', 1) >0;

或许以下几点会有所帮助:

BEGIN
  FOR aName IN (SELECT 'john'  AS EMP_NAME FROM DUAL
                UNION ALL
                SELECT 'sam'   AS EMP_NAME FROM DUAL
                UNION ALL
                SELECT 'peter' AS EMP_NAME FROM DUAL
                UNION ALL
                SELECT 'jack'  AS EMP_NAME FROM DUAL)
  LOOP
    FOR emp IN (SELECT * FROM EMPLOYEE WHERE EMP_NAME LIKE '%' || aName.EMP_NAME || '%')
    LOOP
      DELETE FROM ACCOUNT_DETAILS a WHERE a.EMP_ID = emp.EMP_ID;
      DELETE FROM HR_DETAILS h WHERE h.EMP_ID = emp.EMP_ID;
      DELETE FROM PAY_ROLE_DETAILS p WHERE p.EMP_ID = emp.EMP_ID;

      DBMS_OUTPUT.PUT_LINE('Deleted data for employee with EMP_ID=' || emp.EMP_ID);
    END LOOP;  -- emp
  END LOOP; -- aName
END;
研究这一点,直到你了解它是如何工作的以及为什么工作


分享和享受。

也许以下几点会有所帮助:

BEGIN
  FOR aName IN (SELECT 'john'  AS EMP_NAME FROM DUAL
                UNION ALL
                SELECT 'sam'   AS EMP_NAME FROM DUAL
                UNION ALL
                SELECT 'peter' AS EMP_NAME FROM DUAL
                UNION ALL
                SELECT 'jack'  AS EMP_NAME FROM DUAL)
  LOOP
    FOR emp IN (SELECT * FROM EMPLOYEE WHERE EMP_NAME LIKE '%' || aName.EMP_NAME || '%')
    LOOP
      DELETE FROM ACCOUNT_DETAILS a WHERE a.EMP_ID = emp.EMP_ID;
      DELETE FROM HR_DETAILS h WHERE h.EMP_ID = emp.EMP_ID;
      DELETE FROM PAY_ROLE_DETAILS p WHERE p.EMP_ID = emp.EMP_ID;

      DBMS_OUTPUT.PUT_LINE('Deleted data for employee with EMP_ID=' || emp.EMP_ID);
    END LOOP;  -- emp
  END LOOP; -- aName
END;
研究这一点,直到你了解它是如何工作的以及为什么工作


共享和享受。

当然,您不需要游标本身,但是,他特别要求使用PL/SQL过程,因此游标更适合这种情况。但和往常一样,每件事都有它的优点和缺点。同意他的标准是否更复杂,需要更多的逻辑来处理。当然,你不需要游标本身,但是,他特别要求一个PL/SQL过程,在这种情况下,游标更合适。但和往常一样,每件事都有它的优点和缺点。同意他的标准是否更复杂,需要更多的逻辑来处理。个人偏好。在你需要调整事情或者突然需要满足更复杂的需求的情况下,这是一种更通用的方式。个人偏好。在你需要调整事情或者突然需要满足更复杂的需求的情况下,它是一种更通用的方式。