我正在 ORDS 中编写一个 REST 处理程序。URL 端点应该允许使用许多可选参数进行查询。编写 PL/SQL 代码的一种方法是:
DECLARE
cur SYS_REFCURSOR
BEGIN
OPEN cur FOR
SELECT * FROM MYTABLE WHERE
(:param1 IS NULL OR column1 = :param1) AND
(:param2 IS NULL OR column2 = :param2);
:resultSetOut := cur;
END;
我认为性能稍高的另一种方法是构造 SQL 字符串
DECLARE
cur SYS_REFCURSOR
sqlString VARCHAR2(200)
BEGIN
sqlString := 'SELCT * FROM MYTABLE WHERE 1=1';
IF (:param1 IS NOT NULL) THEN sqlString := sqlString || ' AND COLUMN1=:param1'; END IF;
IF (:param2 IS NOT NULL) THEN sqlString := sqlString || ' AND COLUMN1=:param2'; END IF;
OPEN cur FOR sqlString USING :param1, :param2;
:resultSetOut := cur;
END;
但是,最后的这个字符串构造需要静态绑定到变量,这实际上使得所有变量在 URL 查询中都是必需的而不是可选的。
对于允许动态 WHERE 子句的 PL/SQL 块,是使用此处显示的第一种方法的唯一方法吗?有没有办法构造一个字符串并绑定类似于这里显示的第二种方式?