我有一個包,我需要多次進行類似的聯合。這個包每天執行,我需要每天不同的資料(取決于日期)。所以我雖然創建了一個臨時視圖并在這個視圖上執行操作。由于似乎無法以靜態方式在程序中創建視圖,并且無法使用系結變數,因此我嘗試以這種方式進行操作:
PROCEDURE CREATE_VIEW( from_date DATE) IS
sqlCommand VARCHAR2(32000);
BEGIN
sqlCommand :=
'CREATE VIEW TMP_HELPER_VIEW AS
SELECT ID, IMPORT1_ID, IMPORT2_ID, PROD_ID
FROM
(
SELECT ID,
IMPORT1_ID,
-1,
PROD_ID
FROM TABLE1
WHERE
TS >= '||from_date||'
AND TS < ADD_MONTHS('||from_date||', 1)
UNION
SELECT ID,
-1,
IMPORT2_ID,
PROD_ID
FROM TABLE2
WHERE
TS >= '||from_date||'
AND TS < ADD_MONTHS('||from_date||', 1)';
EXECUTE IMMEDIATE sqlCommand;
END CREATE_VIEW;
不過我到了ORA-00907: missing right parenthesis。我想我以錯誤的方式連接日期變數。有人可以給我一個線索,我該如何解決它?
非常感謝!
uj5u.com熱心網友回復:
使用DATE文字并命名列:
CREATE PROCEDURE CREATE_VIEW(
from_date DATE
)
IS
BEGIN
EXECUTE IMMEDIATE
'CREATE OR REPLACE VIEW TMP_HELPER_VIEW (ID, IMPORT1_ID, IMPORT2_ID, PROD_ID) AS
SELECT ID, IMPORT1_ID, -1, PROD_ID
FROM TABLE1
WHERE TS >= DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||'''
AND TS < ADD_MONTHS(DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||''', 1)
UNION
SELECT ID, -1, IMPORT2_ID, PROD_ID
FROM TABLE2
WHERE TS >= DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||'''
AND TS < ADD_MONTHS(DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||''', 1)';
END CREATE_VIEW;
/
或者,如果要計時包含時間組件,請使用TIMESTAMP文字:
CREATE OR REPLACE PROCEDURE CREATE_VIEW(
from_date DATE
)
IS
BEGIN
EXECUTE IMMEDIATE
'CREATE OR REPLACE VIEW TMP_HELPER_VIEW (ID, IMPORT1_ID, IMPORT2_ID, PROD_ID) AS
SELECT ID, IMPORT1_ID, -1, PROD_ID
FROM TABLE1
WHERE TS >= TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||'''
AND TS < ADD_MONTHS(TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||''', 1)
UNION
SELECT ID, -1, IMPORT2_ID, PROD_ID
FROM TABLE2
WHERE TS >= TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||'''
AND TS < ADD_MONTHS(TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||''', 1)';
END CREATE_VIEW;
/
uj5u.com熱心網友回復:
您可以做的是使用 DBMS_OUTPUT.PUT_LINE 轉儲確切的命令文本。你會看到你會有這樣的東西:
WHERE TS >= 08-DEC-20
這是因為日期沒有引號,所以是您出錯的原因。您實際上希望參考的日期如下所示:
WHERE TS >= '08-DEC-20'
所以你的代碼需要類似的東西
WHERE TS >= '||chr(39)||from_date||chr(39)||'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361917.html
