使用函数中的默认值向表添加列

Add column to table with a default value from function

提问人:Morten Sørensen 提问时间:10/19/2023 最后编辑:LittlefootMorten Sørensen 更新时间:10/21/2023 访问量:57

问:

我对此很陌生,所以请友好;)

我在 PL/SQL 中创建了一个函数,我在其中向函数提供 UserNo,它给了我一个电子邮件地址。

我希望能够做的是,在“My_table”中添加一列“EMAIL”,根据UserNo_column插入电子邮件。

像这样的东西:

Alter table My_Table add EMAIL value {USERNO2EMAIL-function(USERNO_column)} not null;

这是我的函数:

create or replace function userno2email 
  (userno in number)
return
  varchar2 is email varchar2(64);

begin

  select O_EMAIL into email from USERS where O_USERNO = USERNO;
  return email;
end;

谢谢。。

神谕 功能 PLSQL数据库 默认值

评论

3赞 Alex Poole 10/20/2023
如果您不熟悉此方法,那么可能值得检查您是否使用了正确的方法。您说的是设置列的默认值,这意味着它可以在插入时被覆盖,或者稍后修改。这很可能是您的意图,并且可以通过触发器来完成。但是,如果不是,并且它不应该(独立)更改,那么您可能希望使用将表联接到的视图,这样您就不会 (a) 复制数据,并且 (b) 如果表上的数据发生更改,则不同步。usersusers

答:

2赞 Littlefoot 10/20/2023 #1

很快:看起来你必须为此目的使用触发器

下面是一个演示。

users表和初始行:

SQL> create table users
  2  (o_userno number,
  3   o_email varchar2(64)
  4  );

Table created.

SQL> insert into users (o_userno, o_email) values (100, '[email protected]');

1 row created.

功能;我稍微修改了一下,以便使用起来更安全 - 将其与您的版本进行比较(您宁愿继承所涉及的数据类型而不是硬编码它们;如果什么也没找到怎么办?如果您认为需要其他异常处理程序,请包括它们;使用前缀作为参数名称):

SQL> create or replace function userno2email
  2    (par_userno in users.o_userno%type)
  3    return users.o_email%type
  4  is
  5    l_email users.o_email%type;
  6  begin
  7    select O_EMAIL
  8      into l_email
  9      from USERS
 10      where O_USERNO = par_USERNO;
 11    return l_email;
 12  exception
 13    when no_data_Found then
 14      return null;
 15  end;
 16  /

Function created.

这是目标表:

SQL> create table my_table
  2    (id number);

Table created.

这就是你试图做的。语法现在是正确的,但可悲的是,结果是错误的:

SQL> alter table my_table add email varchar2(64)
  2    default userno2email(id);
  default userno2email(id)
          *
ERROR at line 2:
ORA-04044: procedure, function, package, or type is not allowed here

您可以将默认值与语句一起使用 - 这没有问题,但是 - 它必须有效。例如:alter table

SQL> alter table my_table add insert_date date default sysdate;

Table altered.

好的,让我们以允许的方式添加列:email

SQL> alter table my_table add email varchar2(64);

Table altered.

这是我在开头提到的触发器 - 插入后,它将获取某人的电子邮件地址并将其放入适当的列中:my_table

SQL> create or replace trigger trg_bi_myt
  2    before insert on my_table
  3    for each row
  4  begin
  5    :new.email := userno2email(:new.id);
  6  end;
  7  /

Trigger created.

好的,让我们测试一下:

SQL> insert into my_table (id) values (100);

1 row created.

SQL> select * from my_table;

        ID EMAIL                                    INSERT_DATE
---------- ---------------------------------------- -------------------
       100 [email protected]                              19.10.2023 18:54:01

SQL>

如您所见,虽然我只插入了值,但触发了获取的电子邮件地址,而子句 on 则照顾了这一点。IDdefaultinsert_date

0赞 psaraj12 10/21/2023 #2

如果您希望电子邮件 ID 是最新的,则可以使用视图而不是创建额外的列和触发器,如下所示

   create or replace view my_table_view as 
   select id,userno2email(id) as email from my_table;

您可以使用以下查询获取所需的数据

    select * from my_table_view;

enter image description here