我对此很陌生,所以请保持友善;)
我在 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;
谢谢你..
简短地说:看起来您必须使用触发器来达到此目的。
这是一个演示。
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
子句则负责处理这一问题。