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

问题描述 投票:0回答:1

我对此很陌生,所以请保持友善;)

我在 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;

谢谢你..

oracle function plsql default-value
1个回答
0
投票

简短地说:看起来您必须使用触发器来达到此目的。

这是一个演示。

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
值,但触发了获取电子邮件地址,而
default
上的
insert_date
子句则负责处理这一问题。

© www.soinside.com 2019 - 2024. All rights reserved.