create or replace procedure lj_xw_htsh (cHth varchar2)
as
c1 varchar2 (2000);
c2 varchar2 (2000);
c3 varchar2 (2000);
c4 varchar2 (2000);
c5 varchar2 (2000);
c6 varchar2 (2000);
begin
select distinct  '办事处:'|| 办事处 || '          客户编号:' || 客户代码 || '         客户名称:' || 客户名称 into c1 from ljnc_htzc where 合同编号=cHth;
select distinct '乙方产品经销区域:'|| 经销区域  into c2 from ljnc_htzc where  合同编号=cHth;
select distinct '乙方合同总额:'|| 总额/10000 || '万元;     合同首单:' || 首单金额/10000 ||'万元。'  into c3 from ljnc_htzc where 合同编号=cHth;
select distinct '合同保证金:'|| 合同保证金/10000 || '万元;     红花郎专项保证金:' || 红花郎专项/10000 ||'万元;   追加保证金:' || 追加保证金/10000 ||'万元;'
into c4  from ljnc_htzc where 合同编号=cHth;
select distinct 特别约定 into c5 from ljnc_htzc where 合同编号=cHth;
str:='drop table tb_htsh'; 
execute immediate str; 
str:='CREATE GLOBAL TEMPORARY TABLE tb_htsh ( 合同内容 varchar2(2000)) ON COMMIT PRESERVE ROWS'; 
execute immediate str; ----使用动态SQL语句来执行 
str:='insert into tb_htsh (合同内容) values(c1)'; 
execute immediate str; 
str:='insert into tb_htsh (合同内容) values(c2)';
execute immediate str;
str:='insert into tb_htsh (合同内容) values(c3)';
execute immediate str;
str:='insert into tb_htsh (合同内容) values(c4)';
execute immediate str;
str:='insert into tb_htsh (合同内容) values(c5)';
execute immediate str;
str:='insert into tb_htsh (合同内容) values(c6)';
execute immediate str;
str:='select * from  tb_htsh';
execute immediate str;
end lj_xw_htsh;
上面的过程不能正确执行 要实现的功能就是 JAVA 传入合同号 然后去查找这个合同号的数据,把这些数据添加到
过程中建立的临时表中 然后再输出到JAVA中用表格显示给用户
如果用SQL SERVER 来建立很简单 用ORA就太麻烦了

解决方案 »

  1.   

    你一起
    insert into T
    select 1xx
    union all
    select 2xx
    union all
    .....不就可以了么?
    全局临时表本来就可以多个会话公用而不会干扰,干嘛用动态sql去建呢
      

  2.   

    看了一下你的要求,你就是需要把查询的结果集合返回给java,你可以直接返回一个游标就行了,你的程序存在几个错误
    1.str:='drop table tb_htsh';这个地方如果第一次运行的话,你删除表就报错,你的程序无法走进创建临时表的语句就已经中止。
    2.临时表的概念你理解上有问题,你这样还不如拿个普通的表作为临时表实在.你使用的是基于事务的临时表,提交后临时表的数据就已经删除,如果你需要使用这样的表,你可以把这个创建语句放到存储过程外面去执行,这样的临时表对于各个事务来说,等同于一个事务一张表,事务与事务之间的操作完全独立。
    3.execute immediate str;你执行下这个有什么意义呢?返回给java应用程序的是什么呢?什么都没有返回。建议修改:
    不使用临时表,直接返回个游标给java,java里对游标记录直接操作就行了参考代码如下:create or replace procedure lj_xw_htsh (cHth varchar2,o_cur out sys_refcursor)
    as
    begin
    open o_cur select distinct 
    '办事处:'|| 办事处 || ' 客户编号:' || 客户代码 || ' 客户名称:' || 客户名称 c1,
    '乙方产品经销区域:'|| 经销区域  c2, 
    '乙方合同总额:'|| 总额/10000 || '万元; 合同首单:' || 首单金额/10000 ||'万元。' c3,
    '合同保证金:'|| 合同保证金/10000 || '万元; 红花郎专项保证金:' || 红花郎专项/10000 ||'万元;追加保证金:' || 追加保证金/10000 ||'万元;' c4, 
    特别约定 c5 from ljnc_htzc where 合同编号=cHth;
    end lj_xw_htsh;
      

  3.   


    ------少了个for
    create or replace procedure lj_xw_htsh (cHth varchar2,o_cur out sys_refcursor)
    as
    begin
    open o_cur for select distinct 
    '办事处:'|| 办事处 || ' 客户编号:' || 客户代码 || ' 客户名称:' || 客户名称 c1,
    '乙方产品经销区域:'|| 经销区域  c2, 
    '乙方合同总额:'|| 总额/10000 || '万元; 合同首单:' || 首单金额/10000 ||'万元。' c3,
    '合同保证金:'|| 合同保证金/10000 || '万元; 红花郎专项保证金:' || 红花郎专项/10000 ||'万元;追加保证金:' || 追加保证金/10000 ||'万元;' c4, 
    特别约定 c5 from ljnc_htzc where 合同编号=cHth;
    end lj_xw_htsh;
      

  4.   


    他这是基于会话型 的临时表 不是事物型的str:='CREATE GLOBAL TEMPORARY TABLE tb_htsh ( 合同内容 varchar2(2000)) ON COMMIT PRESERVE ROWS'; 
      

  5.   


    create or replace procedure lj_xw_htsh (cHth varchar2,cur out sys_refcursor)
    as
    begin
    open cur for
    with tb as
    (select distinct '办事处:'|| 办事处 || ' 客户编号:' || 客户代码 || ' 客户名称:' || 客户名称 c1  from ljnc_htzc where 合同编号=cHth
    union all
    select distinct '乙方产品经销区域:'|| 经销区域  from ljnc_htzc where 合同编号=cHth
    union all
    select distinct '乙方合同总额:'|| 总额/10000 || '万元; 合同首单:' || 首单金额/10000 ||'万元。'  from ljnc_htzc where 合同编号=cHth
    union all
    select distinct '合同保证金:'|| 合同保证金/10000 || '万元; 红花郎专项保证金:' || 红花郎专项/10000 ||'万元; 追加保证金:' || 追加保证金/10000 ||'万元;'
    from ljnc_htzc where 合同编号=cHth
    union all
    select distinct 特别约定 from ljnc_htzc where 合同编号=cHth)
    select * from tb;
    end lj_xw_htsh;--Java调用的时候要记得及时关闭游标
      

  6.   


    --你这样做临时表没用,建议你添加一个work表,使用完后删除数据即可!