CREATE OR REPLACE FUNCTION make_primarykey(tableName in varchar2) RETURN integer is
num integer;
BEGIN
if not exists(select * from sys_manage_primarykey where upper(table_name)=upper(tableName)) then
insert into sys_manage_primarykey(table_name,current_key) values(tableName,1);
return 1;
end if;
update sys_manage_primarykey set num=current_key + 1,current_key = current_key + 1 where upper(table_name)=upper(tableName) ;
RETURN num;
END make_primarykey;本人新手,仿MSSQL写的上面这个函数的问题,但不知错在哪儿,望Oracle高手帮一下忙,
顺便问一个问题,Oracle中自定义函数不能作为默认值吗?我测试是不行的.
num integer;
BEGIN
if not exists(select * from sys_manage_primarykey where upper(table_name)=upper(tableName)) then
insert into sys_manage_primarykey(table_name,current_key) values(tableName,1);
return 1;
end if;
update sys_manage_primarykey set num=current_key + 1,current_key = current_key + 1 where upper(table_name)=upper(tableName) ;
RETURN num;
END make_primarykey;本人新手,仿MSSQL写的上面这个函数的问题,但不知错在哪儿,望Oracle高手帮一下忙,
顺便问一个问题,Oracle中自定义函数不能作为默认值吗?我测试是不行的.
num integer;BEGIN
update sys_manage_primarykey t set
t.current_key = t.current_key + 1 where table_name=tableName
returning t.current_key+1 into num; if sql%notfound then
insert into sys_manage_primarykey(table_name,current_key) values(tableName,1);
num:=1;
end if; return num;END make_primarykey;
什么意思?你举例说一下!
您的语句创建函数没错,但执行到begin下面第一报错:
ORA-14551 connot perform a DML operation inside a query关于:"顺便问一个问题,Oracle中自定义函数不能作为默认值吗?我测试是不行的."create table test(a integer default make_primarykey('aa'),b varchar2(100));报错.
CREATE OR REPLACE FUNCTION make_primarykey(tableName in varchar2) RETURN integer is
num integer;BEGIN
update sys_manage_primarykey t set
t.current_key = t.current_key + 1 where table_name=tableName
returning t.current_key into num; if sql%notfound then
insert into sys_manage_primarykey(table_name,current_key) values(tableName,1);
num:=0;
end if; return num+1;END make_primarykey;2.你那个语法是不行的,你看看我的blog吧,有些oracle基础的东西。
本人确实新手,特别新的那种.:)
请指出错误.
还有,那个函数还是那个错:执行到begin下面第一报错:
ORA-14551 connot perform a DML operation inside a query
select make_primarykey('ghjkl') from dual;我是这样测试的,是我测试的问题吗?
begin
n_return := make_primarykey('ghjkl');
dbms_output.put_line(n_return);
end;请问默认值的写法是什么?
CREATE OR REPLACE FUNCTION make_primarykey(tableName in varchar2) RETURN integer is
num integer;BEGIN
update sys_manage_primarykey t set
t.current_key = t.current_key + 1 where table_name=tableName
returning t.current_key into num; if sql%notfound then
insert into sys_manage_primarykey(table_name,current_key) values(tableName,1);
num:=1;
end if; return num;END make_primarykey;相信你已经知道这个函数的作用了吧,如果为了防止并发,怎样添加锁,合适呢?
(
table_name varchar2(20),
current_key number(10)
);CREATE OR REPLACE FUNCTION make_primarykey(tableName in varchar2) RETURN integer is
num integer;BEGIN
update sys_manage_primarykey t set
t.current_key = t.current_key + 1 where table_name=tableName
returning t.current_key into num; if sql%notfound then
insert into sys_manage_primarykey(table_name,current_key) values(tableName,1);
num:=0;
end if; return num+1;END make_primarykey;
declare
a number ;
begin
a:=make_primarykey('aaa');
dbms_output.put_line(a);
end;我测试了是可以的,关键我不知道你说的“默认值”是什么东西!
我下班回家了,你在网上好好找找吧。
declare a number ;
begin
a:=make_primarykey('aaa');
dbms_output.put_line(a);
end;
这个方法测试,是没有问题的.这个问题已经解决!多谢!我说的默认值是指字段的default约束,我是像下面这样写的,有语法错误.
create table test(a integer default make_primarykey('aa'),b varchar2(100));还有个问题,是关于防止并发加锁的问题.这里加行级锁还是表级锁合适?应该怎样写呢?不胜感激!