我想創建一個Oracle包,我有一個執行一些動態SQL的過程。如果我使用EXECUTE IMMEDIATE
來完成動態調整,這是沒有問題的,但如果查詢的靜態部分可以編碼爲靜態(以便進行編譯時檢查)會更好。全動態查詢可能使用動態部分擴展靜態SQL語句嗎?
例子:什麼,我試圖讓
-- v_stmt is built dynamically.
v_stmt := 'SELECT count(*) FROM <here some joins> WHERE <here some conditions>';
EXECUTE IMMEDIATE v_stmt
USING v_param1, v_param2
RETURNING INTO v_count;
例的FROM部分靜態:
-- v_stmt is built dynamically.
v_stmt := 'SELECT count(*) FROM my_package.my_function(:param1, :param2) WHERE <here some conditions>';
EXECUTE IMMEDIATE v_stmt
USING v_param1, v_param2
RETURNING INTO v_count;
FUNCTION my_function(
i_param1 IN VARCHAR2,
i_param2 IN NUMBER
)
RETURN SYS_REFCURSOR
AS
v_cursor SYS_REFCURSOR;
BEGIN
-- Open a cursor for different queries depending on params.
IF i_param2 = 1 THEN
OPEN v_cursor FOR <some static query>;
ELSE
OPEN v_cursor FOR <some other static query>;
END IF;
RETURN v_cursor;
END;
這不起作用,因爲它不可能從選擇SYS_REFCURSOR(至少這是我在Google上找到的)。
有什麼辦法可以達到這個目標嗎?
編輯:按照要求,這裏有一些例子:
靜態查詢:
SELECT a.*, ca.CUS_ID FROM adresses a INNER JOIN customer_adresses ca ON (ca.adr_id = a.adr_id);
SELECT p.*, cp.CUS_ID FROM persons p INNER JOIN customer_persons cp ON (cp.per_id = p.per_id);
然後,他們被動態延伸,就像下面的例子:
-- Checks if there is an adress in the customer where the zip is null.
SELECT count(*) FROM <static adresses query> q WHERE q.cus_id = :param1 AND a.zip IS NULL;
-- Checks if there is at least one person in the customer.
SELECT count(*) FROM <static persons query> q WHERE q.cus_id = :param1;
根據您的*精確要求*,這可能會也可能不會。請給我們幹(靜態)查詢和一些動態擴展的具體例子。 – APC 2011-05-31 18:59:11
@APC我已經添加了一些例子。 – cremor 2011-06-01 05:18:10