提问人:Morten Sørensen 提问时间:10/19/2023 最后编辑:LittlefootMorten Sørensen 更新时间:10/21/2023 访问量:57
使用函数中的默认值向表添加列
Add column to table with a default value from function
问:
我对此很陌生,所以请友好;)
我在 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;
谢谢。。
答:
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 则照顾了这一点。ID
default
insert_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;
评论
users
users