sql - 有没有办法动态设置 FOR 循环的 SELECT 查询

标签 sql oracle plsql

我正在尝试的是根据特定条件迭代 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;

这将是一个解决方案,但两种方式的业务逻辑都是相同的,只有我想要迭代的数据不同。我真的很想阻止那种肮脏的复制意大利面的尝试。 有什么建议吗?

最佳答案

您可以使用cursorscursor 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/

相关文章:

sql - 避免在SQL Server 2008中使用MAX + 1整数进行并发问题…制作自己的IDENTITY值

sql - 使用单个查询在 postgres 数据库中搜索多个表?

oracle - ORA-29024 : Certificate validation failure - Apex and HTTPS

regex - 如何在 Oracle 中转义 regexp_replace?

Oracle Ref Cursor Vs Select into 异常处理

Sqlite:CURRENT_TIMESTAMP 是 GMT,不是机器的时区

sql 查询 header 信息以及 informix 中列中的数据

sql - 授予对架构上任何表/ View 的选择

sql - 在oracle中如何在搜索字符串时消除区分大小写

sql - 动态检查变量是否在 PL SQL 中具有值