我想根據程序中引數的null條件在where子句中放置一個條件。但是我做的程式有問題。IF 子句有問題。
如何在程式的 where 子句中添加條件?
CREATE OR REPLACE PROCEDURE SP_PROCEDURE(START_DATE, END_DATE)
IS
START_DATE DATE;
END_DATE DATE;
BEGIN
START_DATE := TO_DATE(START_DATE, 'YYYYMMDD');
END_DATE := TO_DATE(END_DATE, 'YYYYMMDD');
INSERT INTO USER
(
USR_KEY,
USR_NAME
)
SELECT
USR_KEY,
USR_NAME
FROM
USER
WHERE
1 = 1
IF START_DATE THEN --I think there's problem here..
AND USR_CRT_DATE >= START_DATE
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
uj5u.com熱心網友回復:
如果我正確閱讀了您的要求,這應該可以解決問題
CREATE OR REPLACE PROCEDURE SP_PROCEDURE(START_DATE, END_DATE)
IS
START_DATE DATE;
END_DATE DATE;
BEGIN
START_DATE := TO_DATE(START_DATE, 'YYYYMMDD');
END_DATE := TO_DATE(END_DATE, 'YYYYMMDD');
INSERT INTO USER
(
USR_KEY,
USR_NAME
)
SELECT
USR_KEY,
USR_NAME
FROM
USER
WHERE (USR_CRT_DATE >= START_DATE
or START_DATE is null );
COMMIT;
END;
您不需要那個例外處理程式。默認情況下,如果 PL/SQL 單元失敗,它會將更改回滾到程序的開始點。
uj5u.com熱心網友回復:
- 您缺少程序簽名中的資料型別。
- 永遠不要使用
TO_DATE已經是 a 的值DATE(因為它會隱式地將其從日期轉換為字串,然后再轉換回日期,并且可能會在轉換中引入錯誤)。如果要洗掉日期的時間部分,請使用TRUNC而不是嘗試使用TO_DATE. - 在程式中使用是一種不好的做法,
COMMIT因為它不允許您將多個程式鏈接在一起,然后如果一個程式失敗,您可以ROLLBACK全部使用它們;相反,您應該COMMIT在呼叫該程序的事務中。 USER是關鍵字,不能用作不帶引號的識別符號;如果你嘗試,你會得到例外ORA-00903: invalid table name。最佳做法是將表命名為不是關鍵字的名稱,但您也可以使用帶引號的識別符號(這不是最佳做法)。
CREATE OR REPLACE PROCEDURE SP_PROCEDURE(
START_DATE IN DATE,
END_DATE IN DATE
)
IS
BEGIN
INSERT INTO "USER" (
USR_KEY,
USR_NAME
)
SELECT USR_KEY,
USR_NAME
FROM "USER"
WHERE (START_DATE IS NULL OR USR_CRT_DATE >= TRUNC(START_DATE));
END;
/
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/532690.html
標籤:甲骨文if 语句where子句程序
上一篇:在OracleSQL中使用UNION運算子時如何排序。我正在使用兩個選擇陳述句和UNION運算子,我想對兩個查詢的結果進行排序
