這是一個嘗試使用函數來測試VIRTUAL列的使用情況,以增加列中的值。使用Oracle虛擬列來增加值
我正在使用一個函數,它會返回當前年份的最後兩位數字,並與連字符連接,然後是來自表格列的下一個最大值,後者被定義爲虛擬列。
當我向表中插入記錄時,它確實插入成功。然而,當我查詢的記錄,我提示以下錯誤:
ORA-00036:遞歸SQL級別(50)最大數量超過
我的問題是,是否有可能實現到增加值(使用VIRTUAL列自定義增量或這種嘗試是微不足道的?
下面的函數首先通過取消註釋註釋部分和創建表時首先編譯第一個SQL塊,然後使用第二個SQL塊
功能
CREATE OR REPLACE FUNCTION test_func (
p_empl_id NUMBER,
empl_nm VARCHAR2)
RETURN VARCHAR2
DETERMINISTIC
IS
return_value VARCHAR2(32);
BEGIN
return_value := NULL;
-- SELECT TO_CHAR (SYSDATE, 'YY')
-- || '-'
-- || LPAD (
-- TO_CHAR (NVL (MAX (TO_NUMBER (SUBSTR (001, 5))), 0) + 1),
-- 5,
-- '0') into return_value
-- FROM dual;
SELECT TO_CHAR (SYSDATE, 'YY')
|| '-'
|| LPAD (
TO_CHAR (NVL (MAX (TO_NUMBER (SUBSTR (test_col, 5))), 0) + 1),
5,
'0')
INTO return_value
FROM test_table
WHERE SUBSTR (test_col, 1, 2) = TO_CHAR (SYSDATE, 'YY');
RETURN return_value;
END;
/
表結構
CREATE TABLE test_table
(
empl_id NUMBER,
empl_nm VARCHAR2 (50),
monthly_sal NUMBER (10, 2),
bonus NUMBER (10, 2),
test_col AS (test_func (empl_id, empl_nm)) VIRTUAL
);
插入語句
INSERT INTO test_table (empl_id,
empl_nm,
monthly_sal,
bonus)
WITH data
AS (SELECT 100 empl_id,
'AAA' empl_nm,
20000 monthly_sal,
3000 bonus
FROM DUAL)
SELECT *
FROM data;
我曾嘗試使用下面的SQL使用序列嘗試,然而,序列值也越來越插入每次我執行SQL語句時表
SELECT TO_CHAR (SYSDATE, 'YY')
|| '-'
|| '000'
|| test_virtual_sequence.NEXTVAL
FROM DUAL;
這只是一個測試練習,還是你想在生產代碼中使用這個函數?如果後者是真的,那麼使用這樣一個函數是一個非常糟糕的主意,請解釋一下你真正的需求。 ? – krokodilko
@krokodilko無論如何,我不打算在生產中使用它,正如問題中提到的那樣,這當然是一個測試用例,可以知道「虛擬」列的用法。 – user75ponic