TV *_*ath 0 sql oracle plsql plsqldeveloper oracle-sqldeveloper
我有一个名字清单。
约翰,山姆,彼得,杰克
我想查询与上面的每个过滤器相同的SQL。每个查询都会给我一个唯一的员工ID,我想用它删除其他一些记录。
select emp_id from employee where emp_name like '%john%';
Run Code Online (Sandbox Code Playgroud)
假设第一个查询的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;
Run Code Online (Sandbox Code Playgroud)
对于员工列表,我必须重复此操作。伪代码如下所示。
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
Run Code Online (Sandbox Code Playgroud)
我想要一个PL-SQL查询来执行此操作。请帮忙。谢谢。
我尝试的是类似以下内容的东西。
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;
Run Code Online (Sandbox Code Playgroud)
PS尽管根据问题,例如查询可能会导致多条记录,但在实际情况下,保证只有一条记录。在实际情况下,为什么要使用like,它是参考数字而不是名称的列表。参考编号有其他一些前置文本和后置文本,而我的逗号分隔列表仅包含这些数字。
也许以下方法会有所帮助:
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;
Run Code Online (Sandbox Code Playgroud)
对此进行研究,直到您了解其工作方式和原因。
分享并享受。