-
在oracle中如何实现,一个function将传入的insert语句的rowid插入到临时表.3
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 写道引用
--如何将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 ;
数据表create table mytable (field1 varchar2(2),field2 varchar2(2)); create GLOBAL TEMPORARY table tmp_mytmp(rwid char(30)) on commit preserve rows;
过程create or replace function f_myfunc(sqlstr varchar2) return varchar2 as pragma autonomous_transaction; Result varchar2(2000); begin Result := 'insert into tmp_mytmp values('||sqlstr||')'; execute immediate Result; commit; return '1'; end f_myfunc;
调用:select f_myfunc ('insert into mytable(''1'',''2'')' ) from dual; select * from tmp_mytmp;
出错
ORA-00936: 缺失表达式
ORA-06512: 在 "F_MYFUNC", line 8
问题补充:Rainbow702 写道我的意思是这个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;
这么做,运行 是会报语法错的呀.(ORA-00905: 缺失关键字).
我用的是oracle 10g ,难道这个还跟版本有关?
这位大哥,你编译运行通过了?2011年8月31日 15:28
4个答案 按时间排序 按投票排序
-
采纳的答案
引用这么做,运行 是会报语法错的呀.(ORA-00905: 缺失关键字).我机上没有装ORACLE,但是我是模仿你写的来给你个建议,它报哪里错呢?
还有,你可以确定引用sqlstr := sqlstr || 'returning rowid into Result';执行完之后,新生成的记录的ID被存进了Result 了么?2011年8月31日 16:24
-
我的意思是这个
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;
2011年8月31日 16:01
-
引用execute immediate Result;
你这个执行完之后,没有再执行引用
Result := 'insert into tmp_mytmp values(' + ID+ ')';
execute immediate Result;
上面的 ID 就是你引用Result := 'insert into tmp_mytmp values('||sqlstr||')';执行产生的返回值啊。2011年8月31日 15:57
-
引用
--如何将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 ;
2011年8月31日 15:37
相关推荐
mysql虚拟了一个rowid(类似跟oracle的rowid)--SQL语句
Rowid是Oracle数据库中用于唯一标识表中每一行的一个特殊的数据类型。每个Rowid对应着一个特定的物理存储位置,它能够快速定位到表中的某一行数据。Rowid具有以下特点: 1. **唯一性**:对于表中的每一行数据,其...
伪列类似于数据表的列,建立表时,数据库会自动为每个表建立rowid列,但它实际上不存储在表中,因此,当用desc命令来查看任何一个表的结构时,都不会显示有rowid这一列存在。 rowid的概念 在Oracle官方文档中,对...
每行记录在Oracle数据库中都会有一个Rowid,相当于一个物理地址,即使该行数据在数据库中发生了迁移,其Rowid也不会改变。在处理大量数据的情况下,对Rowid的使用可以大幅提高数据访问的效率。 在Oracle数据库中,...
12. 适当使用索引合并:当多个单列索引可以用于同一个查询时,ORACLE可能会合并这些索引,但这可能并不总是最优选择。 13. 避免过度使用子查询:子查询可能导致额外的表扫描和临时结果集,考虑使用连接(JOIN)替代...
当第一次执行某个SQL语句时,Oracle会在内存中解析并缓存这个语句及其执行计划。这个缓存位于系统全局区(SGA)的共享池中,可供所有数据库用户共享。 共享SQL语句的好处包括: - 减少重复解析SQL语句的时间。 - ...
由于他们使用的别名不同,尽管指向的是同一个表,Oracle也不会认为这些查询是相同的。 - **示例3**:假设用户Jack通过私有别名访问plant_detail表,而用户Jill作为所有者直接访问该表。在这种情况下,尽管查询的...
Oracle的ROWID是一个重要的概念,它是数据库中每一行记录的物理地址标识,允许快速定位到数据存储的具体位置。ROWID由一系列的十六进制数字组成,包含数据对象编号、文件编号、块编号以及行编号,这四个部分共同构成...
在本篇文档中,作者详细总结了在实际项目中针对Oracle数据库的update语句优化的四种方案。以下是对这四种方案的知识点进行详细的阐述: 1. 标准update语法优化: 当面对单表更新或较简单的SQL语句时,可以直接使用...
Oracle数据库中的ROWID和ROWNUM是两个非常重要的概念,它们在数据检索和处理中起到关键作用。ROWID是Oracle数据库中用于唯一标识表中每一行的一串字符,它提供了直接访问物理存储位置的能力。ROWID包含数据库块地址...
`ROWID`是Oracle数据库中一个特殊的伪列,它为每一行数据提供了一个唯一的物理地址,类似于内存中的指针。`ROWID`由一系列字符组成,表示了数据在数据块中的位置。它包含了表空间、段、区、块以及行在块内的偏移量等...
7. 整合简单、无关联的数据库访问:如果你有几个简单的数据库查询语句,可以把它们整合到一个查询中(即使它们之间没有关系)。 8. 删除重复记录:最高效的删除重复记录方法是使用 ROWID。 9. 用 TRUNCATE 替代 ...
下面的语句将四条记录插入到 student 表中。 insert into student values('张三','000001','中国'); insert into student values('李四','000002','中国'); insert into student values('王五','000003','中国'); ...
综上所述,Oracle语句优化是一个涉及多个层面的过程,包括优化器选择、访问方法、SQL共享、内存管理、索引使用以及SQL编写技巧等。理解并掌握这些规则,可以显著提升Oracle数据库的性能,从而更好地支持业务需求。
可选择性是 Oracle 中的一个重要概念,它是指 Oracle 优化器在执行 SQL 语句时,选择最优的执行计划的过程。可选择性直接影响到 SQL 语句的执行效率和性能。 执行计划的步骤 执行计划是 Oracle 中的一种数据结构,...
数据插入语句 ............................................. 235 5.2 数据修改语句 ............................................. 238 5.3 数据删除语句 ..............................................
`ROWID` 是Oracle为每一条记录分配的一个唯一标识符,它指向表空间中的物理地址,可以用来快速定位表中的一条记录。与 `ROWNUM` 不同,`ROWID` 是表的一部分,即使在删除或更新记录后,该记录的 `ROWID` 也不会改变...
- **全表扫描(Full Table Scan, FTS)**:Oracle一次性读取多个数据块以优化全表扫描,但应尽量避免,因为它可能导致高I/O操作。 - **通过ROWID访问**:ROWID包含记录的物理位置信息,通过索引可以快速找到ROWID...
共享SQL语句是Oracle性能提升的另一个关键策略。解析后的SQL语句存储在SGA的共享池中,供所有用户共享,减少解析开销。然而,只有完全相同的SQL语句(包括空格和换行)才能共享,这意味着对SQL的编写规范要求较高。...