在存储过程中要完成如下操作:
1,建一个临时表
2,相表中添加一些记录
3,返回查询临时表的记录集
4,删除临时表
我做了一个过程,但是不能执行,不知道为什么,请大家帮帮忙!
   procedure nt(a in int, b in varchar2, c in varchar2, retcur out curtype) is
strsql varchar2(1000);
begin
strsql :=' CREATE GLOBAL TEMPORARY TABLE tmp
(
  id int;
  name char(8);
)ON COMMIT DELETE ROWS';
execute immediate strsql;strsql := 'insert into tmp(id,name) values('|| to_char(a)||','''||b||''')';
execute immediate strsql;
open retcur for
select * from tmp where tmp.id = a;
strsql :='drop table tmp';
execute immediate strsql;
end nt;
错误提示是ORA-06508: PL/SQL: could not find program unit being called
请问如何解决这个问题呢?

解决方案 »

  1.   

    14:47:27 jlanzpa817>create or replace procedure nt(a in int, b in varchar2,
    14:48:16   2  c in varchar2, retcur out curtype) is
    14:48:16   3  strsql varchar2(1000);
    14:48:16   4  begin
    14:48:16   5  strsql :=' CREATE GLOBAL TEMPORARY TABLE tmp(id int,name char(8)) ON COMMIT DELETE ROW
    S';
    14:48:16   6  execute immediate strsql;
    14:48:16   7  
    14:48:16   8  strsql := 'insert into tmp(id,name) values('|| to_char(a)||','''||b||''')';
    14:48:16   9  execute immediate strsql;
    14:48:16  10  open retcur for
    14:48:16  11  select * from tmp where tmp.id = a;
    14:48:16  12  strsql :='drop table tmp';
    14:48:16  13  execute immediate strsql;
    14:48:16  14  end;
    14:48:16  15  /警告: 创建的过程带有编译错误。已用时间:  00: 00: 00.01
    14:48:18 jlanzpa817>sho err
    PROCEDURE NT 出现错误:LINE/COL ERROR
    -------- -----------------------------------------------------------------
    0/0      PL/SQL: Compilation unit analysis terminated
    2/27     PLS-00201: 必须说明标识符 'CURTYPE'
      

  2.   

    我忘写全了,这是一个包,包部分我没有写。全部是:
    create or replace package ntest is
    type curtype is ref cursor;
      procedure nt(a in int, b in varchar2, c in varchar2, retcur out curtype);
    end ntest;
    /
     create or replace package body ntest is
       procedure nt(a in int, b in varchar2, c in varchar2, retcur out curtype) is
    strsql varchar2(1000);
    begin
    strsql :=' CREATE GLOBAL TEMPORARY TABLE tmp
    (
      id int;
      name char(8);
    )ON COMMIT DELETE ROWS';
    execute immediate strsql;strsql := 'insert into tmp(id,name) values('|| to_char(a)||','''||b||''')';
    execute immediate strsql;
    open retcur for
    select * from tmp where tmp.id = a;
    strsql :='drop table tmp';
    execute immediate strsql;
    end nt;
    end ntest;
      

  3.   

    to babyboom532(贝贝):
    retcur out curtype 有和错误?我觉得错误应在临时表上,是不是临时表被删除之后,就不能返回基于他的查询的记录集?
      

  4.   

    strsql :=' CREATE GLOBAL TEMPORARY TABLE tmp
    (
      id int;
      name char(8);
    )ON COMMIT DELETE ROWS';
    execute immediate strsql;语法不对,不能多行写.临时表被删除之后,就不能返回基于他的查询的记录集了.
      

  5.   

    那如何实现类似的功能呢?在SQL Server中都可以实现的呀!
      

  6.   

    楼主老兄:
    说举公道话,
    您这种做法
    1,建一个临时表
    2,相表中添加一些记录
    3,返回查询临时表的记录集
    4,删除临时表
    不合适,您是受了SYBASE
    SQLSERVER
    等数据库的影响了
    在ORACLE
    中临时表想永久表一样创建,
    您在过程中只需2,3步就可以了
      

  7.   

    临时表没有创建,所以open retcur for出错.
    不知道能不能动态open cursor.
      

  8.   

    to jlandzpa(欧高黎嘉陈) :
    我是一个初学者,你说临时表没有创建,那就是说这句话没有执行:
    strsql :=' CREATE GLOBAL TEMPORARY TABLE tmp
    (
      id int;
      name char(8);
    )ON COMMIT DELETE ROWS';
    execute immediate strsql;
    为什么没有执行呢?那如何能创建临时表呢?
    我觉得楼主应该想点其他的方法,比如说事先把需要的表建好,用前用后都倾空表,不就OK了。方法太笨了,想点其他方法也行,条条大路同罗马嘛!
      

  9.   

    楼主老兄:
    说举公道话,
    您这种做法
    1,建一个临时表
    2,相表中添加一些记录
    3,返回查询临时表的记录集
    4,删除临时表
    不合适,您是受了SYBASE
    SQLSERVER
    等数据库的影响了
    在ORACLE
    中临时表想永久表一样创建,
    您在过程中只需2,3步就可以了