vishare
vishare
2011-08-31 15:28
浏览 500

在oracle中如何实现,一个function将传入的insert语句的rowid插入到临时表.

[code="java"]create or replace function f_myfunc(sqlstr varchar2)

is
pragma autonomous_transaction;
Result varchar2(2000);
begin
--sqlstr类似于 'insert into mytable (field1, field2) values ('1', '2')' ;
-- insert into mytable (field1, field2) values ('1', '2') returning rowid into Result; 这样是可以得到rowid的
execute immediate sqlstr ;
--如何将rowid插入到tmp_mytmp中?
insert into tmp_mytmp values(??);
commit;

end f_myfunc;[/code]

调用这个过程时
select f_myfunc ('insert into mytable (field1, field2) values ('1', '2')') from dual;
select * from tmp_mytmp 希望能查到那个rowid.

请问如何实现?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • rainbow702
    rainbow702 2011-08-31 16:24
    已采纳

    [quote]这么做,运行 是会报语法错的呀.(ORA-00905: 缺失关键字). [/quote]我机上没有装ORACLE,但是我是模仿你写的来给你个建议,它报哪里错呢?
    还有,你可以确定[quote]sqlstr := sqlstr || 'returning rowid into Result'; [/quote]执行完之后,新生成的记录的ID被存进了Result 了么?

    点赞 评论
  • rainbow702
    rainbow702 2011-08-31 15:37

    [quote]
    --如何将rowid插入到tmp_mytmp中?

    insert into tmp_mytmp values(??);
    [/quote]
    你可以模仿这个[quote]insert into mytable (field1, field2) values ('1', '2')' ;[/quote]
    [code="sql"]
    sqlstr = 'insert into tmp_mytmp values(' + Result + ')';
    execute immediate sqlstr ;

    [/code]

    点赞 评论
  • rainbow702
    rainbow702 2011-08-31 15:57

    [quote]execute immediate Result;[/quote]
    你这个执行完之后,没有再执行
    [quote]
    Result := 'insert into tmp_mytmp values(' + ID+ ')';

    execute immediate Result;
    [/quote]
    上面的 ID 就是你[quote]Result := 'insert into tmp_mytmp values('||sqlstr||')'; [/quote]执行产生的返回值啊。

    点赞 评论
  • rainbow702
    rainbow702 2011-08-31 16:01

    我的意思是这个
    [code="sql"]
    create or replace function f_myfunc(sqlstr varchar2) return varchar2

    as

    pragma autonomous_transaction;

    Result varchar2(2000);

    begin

    sqlstr := sqlstr || 'returning rowid into Result';

    execute immediate Result;
    sqlstr := 'insert into tmp_mytmp values(' || Result || ')';

    execute immediate Result;
    commit;

    return '1';

    end f_myfunc;
    [/code]

    点赞 评论

相关推荐