0 0

在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个答案 按时间排序 按投票排序

0 0

采纳的答案

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

2011年8月31日 16:24
0 0

我的意思是这个

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
0 0

引用
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
0 0

引用

--如何将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语句.sql

    mysql虚拟了一个rowid(类似跟oracle的rowid)--SQL语句

    Oracle中用Rowid查找和删除表中的重复记录

    Rowid是Oracle数据库中用于唯一标识表中每一行的一个特殊的数据类型。每个Rowid对应着一个特定的物理存储位置,它能够快速定位到表中的某一行数据。Rowid具有以下特点: 1. **唯一性**:对于表中的每一行数据,其...

    Oracle数据库rowid深入探析.pdf

    伪列类似于数据表的列,建立表时,数据库会自动为每个表建立rowid列,但它实际上不存储在表中,因此,当用desc命令来查看任何一个表的结构时,都不会显示有rowid这一列存在。 rowid的概念 在Oracle官方文档中,对...

    试论Rowid在Oracle数据库中的应用.pdf

    每行记录在Oracle数据库中都会有一个Rowid,相当于一个物理地址,即使该行数据在数据库中发生了迁移,其Rowid也不会改变。在处理大量数据的情况下,对Rowid的使用可以大幅提高数据访问的效率。 在Oracle数据库中,...

    Oracle语句优化53个规则详解.doc

    12. 适当使用索引合并:当多个单列索引可以用于同一个查询时,ORACLE可能会合并这些索引,但这可能并不总是最优选择。 13. 避免过度使用子查询:子查询可能导致额外的表扫描和临时结果集,考虑使用连接(JOIN)替代...

    Oracle语句优化53个规则详解.doc

    当第一次执行某个SQL语句时,Oracle会在内存中解析并缓存这个语句及其执行计划。这个缓存位于系统全局区(SGA)的共享池中,可供所有数据库用户共享。 共享SQL语句的好处包括: - 减少重复解析SQL语句的时间。 - ...

    Oracle语句优化53个规则详解.pdf

    由于他们使用的别名不同,尽管指向的是同一个表,Oracle也不会认为这些查询是相同的。 - **示例3**:假设用户Jack通过私有别名访问plant_detail表,而用户Jill作为所有者直接访问该表。在这种情况下,尽管查询的...

    oraclerowid在表行中的物理标识.pdf

    Oracle的ROWID是一个重要的概念,它是数据库中每一行记录的物理地址标识,允许快速定位到数据存储的具体位置。ROWID由一系列的十六进制数字组成,包含数据对象编号、文件编号、块编号以及行编号,这四个部分共同构成...

    update语句的优化-oracle .pdf

    在本篇文档中,作者详细总结了在实际项目中针对Oracle数据库的update语句优化的四种方案。以下是对这四种方案的知识点进行详细的阐述: 1. 标准update语法优化: 当面对单表更新或较简单的SQL语句时,可以直接使用...

    oracle rowid

    Oracle数据库中的ROWID和ROWNUM是两个非常重要的概念,它们在数据检索和处理中起到关键作用。ROWID是Oracle数据库中用于唯一标识表中每一行的一串字符,它提供了直接访问物理存储位置的能力。ROWID包含数据库块地址...

    oracle_SQL-rowid--rownum.zip_oracle

    `ROWID`是Oracle数据库中一个特殊的伪列,它为每一行数据提供了一个唯一的物理地址,类似于内存中的指针。`ROWID`由一系列字符组成,表示了数据在数据块中的位置。它包含了表空间、段、区、块以及行在块内的偏移量等...

    ORACLE 优化sql语句提高oracle执行效率 .doc

    7. 整合简单、无关联的数据库访问:如果你有几个简单的数据库查询语句,可以把它们整合到一个查询中(即使它们之间没有关系)。 8. 删除重复记录:最高效的删除重复记录方法是使用 ROWID。 9. 用 TRUNCATE 替代 ...

    oracle基础语句.docx

    下面的语句将四条记录插入到 student 表中。 insert into student values('张三','000001','中国'); insert into student values('李四','000002','中国'); insert into student values('王五','000003','中国'); ...

    Oracle语句优化53个规则详解.

    综上所述,Oracle语句优化是一个涉及多个层面的过程,包括优化器选择、访问方法、SQL共享、内存管理、索引使用以及SQL编写技巧等。理解并掌握这些规则,可以显著提升Oracle数据库的性能,从而更好地支持业务需求。

    SQL语句性能调整 ORACLE的执行计划.

    可选择性是 Oracle 中的一个重要概念,它是指 Oracle 优化器在执行 SQL 语句时,选择最优的执行计划的过程。可选择性直接影响到 SQL 语句的执行效率和性能。 执行计划的步骤 执行计划是 Oracle 中的一种数据结构,...

    达梦数据库用户手册基础学习版.rar

    数据插入语句 ............................................. 235 5.2 数据修改语句 ............................................. 238 5.3 数据删除语句 ..............................................

    在oracle中灵活使用Rownum和rowId

    `ROWID` 是Oracle为每一条记录分配的一个唯一标识符,它指向表空间中的物理地址,可以用来快速定位表中的一条记录。与 `ROWNUM` 不同,`ROWID` 是表的一部分,即使在删除或更新记录后,该记录的 `ROWID` 也不会改变...

    oracle语句优化30个规则详解.docx

    - **全表扫描(Full Table Scan, FTS)**:Oracle一次性读取多个数据块以优化全表扫描,但应尽量避免,因为它可能导致高I/O操作。 - **通过ROWID访问**:ROWID包含记录的物理位置信息,通过索引可以快速找到ROWID...

    oracle语句优化53个规则详解.docx

    共享SQL语句是Oracle性能提升的另一个关键策略。解析后的SQL语句存储在SGA的共享池中,供所有用户共享,减少解析开销。然而,只有完全相同的SQL语句(包括空格和换行)才能共享,这意味着对SQL的编写规范要求较高。...

Global site tag (gtag.js) - Google Analytics