通过 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 调用替换为 functiondefault 子句中)如下。 (请注意 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 的成功。

干杯!!