我正在 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 塊,是否可以使用此處顯示的第一種方法?有沒有辦法構造一個字串并系結類似于此處顯示的第二種方式?
uj5u.com熱心網友回復:
你在正確的軌道上:
IF (:param1 IS NOT NULL) THEN sqlString := sqlString || ' AND COLUMN1=:param1';
Else sqlString := sqlString || ' and (1=1 or :param1 is null) ';
END IF;
現在,無論如何都需要相同數量的系結變數,并且 Oracle 優化器將知道 1 始終為 1,因此不需要考慮其他謂詞。
uj5u.com熱心網友回復:
您可以在沒有動態 SQL 的情況下以等效方式執行此操作:
BEGIN
IF :param1 IS NOT NULL AND :param1 IS NOT NULL THEN
OPEN :resultSetOut FOR
SELECT *
FROM MYTABLE
WHERE COLUMN1=:param1
AND COLUMN2=:param2;
ELSIF :param1 IS NOT NULL THEN
OPEN :resultSetOut FOR
SELECT *
FROM MYTABLE
WHERE COLUMN1=:param1;
ELSIF :param2 IS NOT NULL THEN
OPEN :resultSetOut FOR
SELECT *
FROM MYTABLE
WHERE COLUMN2=:param2;
ELSE
OPEN :resultSetOut FOR
SELECT *
FROM MYTABLE;
END IF;
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/346923.html
標籤:甲骨文 plsql 神谕命令 oracle-rest-data-services
上一篇:此查詢結果的格式時間
下一篇:如何將權限表授予用戶帳戶?
