这是一个尝试使用函数来测试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