通过 Oracle 中的函数更改 table 并添加具有默认值的新列
Alter table and add new column with default value via a function in Oracle
我正在尝试更新 Oracle 中的 table。 table 是使用以下 DDL 创建的:
CREATE TABLE TEST (
ID_NUM INTEGER,
NAME INTEGER,
VALUE INTEGER,
ITEMS_NUM INTEGER,
)
并且有一些数据被注入到这个 table 中。现在,我需要更新 table 以将 ID_NUM 列更改为 VARCHAR 并将格式化的 UUID 添加为默认值。
我已按照下面给出的查询进行操作:
CREATE OR REPLACE FUNCTION RANDOM_UUID RETURN VARCHAR IS
V_UUID VARCHAR(255);
BEGIN
SELECT REGEXP_REPLACE(RAWTOHEX(SYS_GUID()), '([A-F0-9]{8})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{12})', '----') INTO V_UUID FROM DUAL;
RETURN V_UUID;
END RANDOM_UUID;
ALTER TABLE TEST
DROP COLUMN ID_NUM;
ALTER TABLE TEST
ADD ID_NUM VARCHAR(255) DEFAULT random_uuid() NOT NULL;
它给出了一个错误 SQL Error [4044] [42000]: ORA-04044: procedure, function, package, or type is not allowed here
我已经使用以下命令执行并验证了该函数,它提供了一个有效的格式化 UUID。
SELECT RANDOM_UUID() FROM DUAL;
ALTER table 语句中的问题可能是什么。我们不能在 Oracle 中使用函数来设置默认值吗?
提前致谢。
默认值必须是实际值,而不是函数。
您不能在默认表达式中使用 PL/SQL 函数。但它可以是 SQL function.Here 的摘录 19c Doc:
默认列值受以下限制:
- DEFAULT 表达式不能包含对 PL/SQL 函数或
其他列、伪列 LEVEL、PRIOR 和 ROWNUM,或日期
未完全指定的常量。
下面是一个使用 sql 函数的例子:
SQL> create table tc (c1 number default sqrt(2));
Table TC created.
我认为你可以在 column
上使用 default clause
而不用 function
来实现它(只需将 function
调用替换为 function
在 default
子句中)如下。 (请注意 default clause
中不允许 User functions
)
ALTER TABLE TEST
ADD ID_NUM VARCHAR(255)
DEFAULT REGEXP_REPLACE(RAWTOHEX(SYS_GUID()), '([A-F0-9]{8})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{12})', '----')
NOT NULL;
我已经准备好 db<>fiddle demo 来向您展示 function
的错误和没有 function
的成功。
干杯!!
我正在尝试更新 Oracle 中的 table。 table 是使用以下 DDL 创建的:
CREATE TABLE TEST (
ID_NUM INTEGER,
NAME INTEGER,
VALUE INTEGER,
ITEMS_NUM INTEGER,
)
并且有一些数据被注入到这个 table 中。现在,我需要更新 table 以将 ID_NUM 列更改为 VARCHAR 并将格式化的 UUID 添加为默认值。
我已按照下面给出的查询进行操作:
CREATE OR REPLACE FUNCTION RANDOM_UUID RETURN VARCHAR IS
V_UUID VARCHAR(255);
BEGIN
SELECT REGEXP_REPLACE(RAWTOHEX(SYS_GUID()), '([A-F0-9]{8})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{12})', '----') INTO V_UUID FROM DUAL;
RETURN V_UUID;
END RANDOM_UUID;
ALTER TABLE TEST
DROP COLUMN ID_NUM;
ALTER TABLE TEST
ADD ID_NUM VARCHAR(255) DEFAULT random_uuid() NOT NULL;
它给出了一个错误 SQL Error [4044] [42000]: ORA-04044: procedure, function, package, or type is not allowed here
我已经使用以下命令执行并验证了该函数,它提供了一个有效的格式化 UUID。
SELECT RANDOM_UUID() FROM DUAL;
ALTER table 语句中的问题可能是什么。我们不能在 Oracle 中使用函数来设置默认值吗?
提前致谢。
默认值必须是实际值,而不是函数。
您不能在默认表达式中使用 PL/SQL 函数。但它可以是 SQL function.Here 的摘录 19c Doc:
默认列值受以下限制:
- DEFAULT 表达式不能包含对 PL/SQL 函数或 其他列、伪列 LEVEL、PRIOR 和 ROWNUM,或日期 未完全指定的常量。
下面是一个使用 sql 函数的例子:
SQL> create table tc (c1 number default sqrt(2));
Table TC created.
我认为你可以在 column
上使用 default clause
而不用 function
来实现它(只需将 function
调用替换为 function
在 default
子句中)如下。 (请注意 default clause
中不允许 User functions
)
ALTER TABLE TEST ADD ID_NUM VARCHAR(255) DEFAULT REGEXP_REPLACE(RAWTOHEX(SYS_GUID()), '([A-F0-9]{8})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{12})', '----') NOT NULL;
我已经准备好 db<>fiddle demo 来向您展示 function
的错误和没有 function
的成功。
干杯!!