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

问题描述

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;调用这个过程时select f_myfunc ('insert into mytable (field1, field2) values ('1', '2')') from dual;select * from tmp_mytmp 希望能查到那个rowid.请问如何实现? 问题补充:Rainbow702 写道

解决方案

引用这么做,运行 是会报语法错的呀.(ORA-00905: 缺失关键字). 我机上没有装ORACLE,但是我是模仿你写的来给你个建议,它报哪里错呢?还有,你可以确定引用sqlstr := sqlstr || 'returning rowid into Result'; 执行完之后,新生成的记录的ID被存进了Result 了么?
解决方案二:
我的意思是这个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;
解决方案三:
引用execute immediate Result;你这个执行完之后,没有再执行引用Result := 'insert into tmp_mytmp values(' + ID+ ')'; execute immediate Result;上面的 ID 就是你引用Result := 'insert into tmp_mytmp values('||sqlstr||')'; 执行产生的返回值啊。
解决方案四:
引用--如何将rowid插入到tmp_mytmp中? insert into tmp_mytmp values(??);你可以模仿这个引用insert into mytable (field1, field2) values ('1', '2')' ;sqlstr = 'insert into tmp_mytmp values(' + Result + ')';execute immediate sqlstr ;

时间: 2024-08-31 12:57:22

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

格式-请问oracle中如何得到一个日期是周几

问题描述 请问oracle中如何得到一个日期是周几 select to_number(sysdate,'day') from dual; 是会报错的 不要to_char的 解决方案 select to_number(to_char(sysdate - 1,'d')) from dual; 解决方案二: select trunc(sysdate) - trunc(sysdate,'day') from dual

Oracle中如何判断一个字符串是否含有汉字(中文)

oracle中如何判断一个字符串是否含有汉字 1.1  BLOG文档结构图       1.2  前言部分   1.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ①全角字符的判断,或者是含有汉字的字符串的判断       本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 1.2.2  实验环境介绍   11.2.0.3  RHEL6.5       1.2.3  本文

ibatis调用Oracle中的存储过程和function

一.调用存储过程 Oracle代码 procedure proc_pos_check(p_gtin  in varchar2,                            p_safe_code   in varchar2,                            p_in_sell_id  in varchar2,                            p_buy_id      in varchar2,                        

Mybatis调用Oracle中的存储过程和function

一.Mybatis调用存储过程 1 在数据库中创建以下的存储过程 create or replace procedure pro_hello(p_user_name in varchar2,p_result out varchar2) is begin   p_result := 'hello,' || p_user_name; end; 2 编写SQL映射文件mapper.xml statementType里的CALLABLE是标注此sql为存储过程. parameterType是标注要传的参

Oracle中如何绑定变量

oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析. 一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行), 而且引起的问题不能通过增加内存条和cpu的数量来解决. 之所以这样是因为门闩是为了顺序访问以及修改一些内存区域而设置的,这些内存区域是不能被同时修改.当一个sql语句提交后,oracle会首先检查一下共享

Oracle中FORALL执行UPDATE语句

在ITPUB上看到一个FORALL执行UPDATE的帖子,觉得有点意思,简单记录一下. 以前研究过FORALL中的INSERT语句,发现语句通过绑定数组的方式,实现了批量绑定,一次运行的方式,从而提高了执行的效率. 但是对于UPDATE语句而言,Oracle的实现和INSERT是不同的: SQL> CREATE TABLE T AS SELECT ROWNUM ID FROM TAB; 表已创建. SQL> SELECT * FROM T;  ID ----------   1   2   3

oracle中的闩锁(latch)简介

1.闩锁.锁定和并发性 数据库系统本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库.这里就涉及两个很重要的问题. 这些用户之间的操作不会互相破坏.比如两个用户同时在相同的物理位置上写数据时,不能发生互相覆盖的情况.这叫串行化,也就是说,即便两个用户同 时写,也必须有先后,一个用户写完,另一个用户继续写.串行化会降低系统的并发性,但这对于保护数据结构不被破坏来说则是必需的. 在满足串行化的前提下,如何将并发性提升到最大. 在Oracle数据库中,通过闩锁(latch)

全面解析oracle中的锁机制4

7.enqueue: 什么是enqueue enqueue可以做名词,也可以做动词来解释. 做名词时,指的的是一种锁的类型,比如Tx enqueue. 做动词时,则是指将锁请求放入到请求队列的操作. 我们知道,lock是一种需要排队的锁实现机制,这和latch是不一样的,latch是一种轻量级的锁,是不需要排队得.Enqueue就是lock的排队机制的实现. lock是用来实现对于共享资源的并发访问的.如果两个session请求的lock是兼容的,则可以同时锁定资源,如果两个session请求的

oracle中的DECODE

原文:oracle中的DECODE   DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值.函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式.当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值.区别于SQL的其它函数,DECODE函数还能识别和操作空值. 其具体的语法格式如下: DECODE(input_value,value,result[,value,result-][,default_result]); 其中: