我正在尝试的是根据特定条件迭代 SELECT。
CREATE OR REPLACE PROCEDURE procedure
IS
selectForLoop varchar2(256);
v_birthdate date;
BEGIN
select X into v_birthdate from Y where C = Z;
IF true THEN
selectForLoop := 'Select name from employees';
ELSE
selectForLoop := 'Select name from employees where birthdate = v_birthdate';
END IF;
FOR val in (selectForLoop)
LOOP
BusinessLogic
END LOOP;
我能做的是:
CREATE OR REPLACE PROCEDURE procedure
IS
v_birthdate date;
BEGIN
select X into v_birthdate from Y where C = Z;
If true THEN
FOR i IN (Select name from employees)
LOOP
BusinessLogic
END LOOP;
ELSE
FOR i IN (Select name from employees where birthdate = v_birthdate
LOOP
BusinessLogic
END LOOP;
END IF;
这将是一个解决方案,但两种方式的业务逻辑都是相同的,只有我想要迭代的数据不同。我真的很想阻止那种肮脏的复制意大利面的尝试。 有什么建议吗?
最佳答案
您可以使用cursors和 cursor variables在 PL/SQL 中动态切换查询。
CREATE OR REPLACE PROCEDURE procedure
IS
selectForLoop varchar2(256);
v_name employees%name%TYPE;
v_birthdate date;
v_cursor SYS_REFCURSOR;
BEGIN
IF condition THEN
OPEN v_cursor FOR SELECT name FROM employees;
ELSE
OPEN v_cursor FOR SELECT name FROM employees WHERE birthdate =
v_birthdate;
END IF;
LOOP
FETCH v_cursor INTO v_name;
EXIT WHEN v_cursor%NOTFOUND;
BusinessLogic;
END LOOP;
CLOSE v_cursor;
END;
您还可以将游标变量作为参数传递给业务逻辑,并将循环移至业务逻辑过程内:
OPEN v_cursor FOR selectForLoop;
BusinessLogic(v_cursor);
CLOSE v_cursor;
CREATE OR REPLACE
PROCEDURE BusinessLogic(p_cursor SYS_REFCURSOR IN) IS
v_name employees%name%TYPE;
BEGIN
LOOP
FETCH p_cursor INTO v_name;
EXIT WHEN p_cursor%NOTFOUND;
-- Do business logic
END LOOP;
END;
关于sql - 有没有办法动态设置 FOR 循环的 SELECT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69250256/