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中自定义函数不能作为默认值吗?我测试是不行的.

解决方案 »

  1.   

    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+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;
      

  2.   

    顺便问一个问题,Oracle中自定义函数不能作为默认值吗?我测试是不行的.---------------------------------------
    什么意思?你举例说一下!
      

  3.   

    非常谢谢kinglht(爱新觉罗至尊宝) !
    您的语句创建函数没错,但执行到begin下面第一报错:
    ORA-14551 connot perform a DML operation inside a query关于:"顺便问一个问题,Oracle中自定义函数不能作为默认值吗?我测试是不行的."create table test(a  integer default make_primarykey('aa'),b varchar2(100));报错.
      

  4.   

    1.
    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基础的东西。
      

  5.   

    kinglht(爱新觉罗至尊宝) :
    本人确实新手,特别新的那种.:)
    请指出错误.
    还有,那个函数还是那个错:执行到begin下面第一报错:
    ORA-14551 connot perform a DML operation inside a query
      

  6.   

    create table sys_manage_primarykey (table_name varchar2(50), current_key integer);
    select make_primarykey('ghjkl') from dual;我是这样测试的,是我测试的问题吗?
      

  7.   

    我在itpub问到了以下测试方法,对不起,见笑了,我连这个都不懂declare n_return number;
    begin
    n_return := make_primarykey('ghjkl');
    dbms_output.put_line(n_return);
    end;请问默认值的写法是什么?
      

  8.   

    看了你的函数写法,简直太漂亮了,但我改了一下业务逻辑:
    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;相信你已经知道这个函数的作用了吧,如果为了防止并发,怎样添加锁,合适呢?
      

  9.   

    create table sys_manage_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;我测试了是可以的,关键我不知道你说的“默认值”是什么东西!
    我下班回家了,你在网上好好找找吧。
      

  10.   

    我按照
    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));还有个问题,是关于防止并发加锁的问题.这里加行级锁还是表级锁合适?应该怎样写呢?不胜感激!