oracle 使用函数中的默认值将列添加到表中

watbbzwu  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(128)

我对这个很陌生,所以请善待我;)
我已经在PL/SQL中创建了一个函数,我给函数一个UserNo,它给了我一个电子邮件地址。
我希望能够做的是,添加一个列'EMAIL'到'My_table'中,该列根据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;


谢谢你...

uqzxnwby

uqzxnwby1#

简单地说:看起来你必须使用一个触发器来实现这个目的。
这里有一个演示。
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>


正如您所看到的,虽然我只插入了ID值,但触发器获取了电子邮件地址,而insert_date上的default子句负责处理这一点。

relj7zay

relj7zay2#

如果你想这电子邮件id是最新的你可以使用一个视图而不是创建一个额外的列和如下触发器

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

字符串
您可以使用以下查询获取所需数据

select * from my_table_view;


的数据

相关问题