小弟存储过程是小白,现需要两个存储过程第一个:传入表名 id 来删除该表的该条记录
第二个:传入表名,每页显示条数(pagesize,入5,10),起始条数(offset如10,20,30),排序字段名(order),排序方式(asc,desc)从而返回该表的结果集,如果排序字段为空则不排序,如果offset为空则全部返回(最好能为hibernate动态封装为某个领域模型,即在每个领域模型.htm.xml中配置该存储过程,并封装为该领域模型,如果太复杂也可不实现,我自己手动作就好)
各位大虾,多谢多谢,

解决方案 »

  1.   

    --创建过程
    create or replace procedure pro_test1(tabname in varchar2,id in number)
    as
    begin
      execute immediate 'delete from '||tabname||' where id='||id;
    end pro_test1;--调用执行
    begin
    pro_test1('t',1);
    end;
      

  2.   

    2.
    create or replace procedure pro_test2(pagesize in number,offset in number,order_col varchar2,order_mod varchar2)
    as
    cur sys_refcursor;
    sqlstr varchar2(1000);
    v_col1 varchar2(100);
    v_col2 varchar2(100);
    v_col3 varchar2(100);
    begin
    sqlstr:='select col1,col2,col3 from(
        select t.*,row_number()over(order by '||order_col||' '||order_mod||')rn from table1 t)
        where rn>='||offset||' and rn<'||(offset+pagesize);
    open cur for sqlstr;
    loop
      fetch cur into v_col1,v_col2,v_col3;
      exit when cur%notfound;
      dbms_output.put_line(v_col1||'  '||v_col2||'  '||v_col3);
    end loop;
    close cur;
    end pro_test2;
      

  3.   

    sorry 第一个忘了一个条件 ,就是如果成功返回1 失败或发生异常返回0,不知能否实现
      

  4.   

    要返回值的话,可以改成函数,或者在过程里加个传出参数
    加个异常段来处理
    create or replace procedure pro_test1(tabname in varchar2,id in number,flag out number)
    as
    begin
      execute immediate 'delete from '||tabname||' where id='||id;
      flag:=1;
    exception
      when others then
      flag:=2;
    end pro_test1;
      

  5.   

    create or replace procedure pro_test2(tabname in varchar2,pagesize in number,offset in number,order_col varchar2,order_mod varchar2)
    as
    cur sys_refcursor;
    sqlstr varchar2(1000);
    v_col1 varchar2(100);
    v_col2 varchar2(100);
    v_col3 varchar2(100);
    begin
    sqlstr:='select col1,col2,col3 from(
        select t.*,row_number()over(order by '||order_col||' '||order_mod||')rn from '||tabname||' t)
        where rn>='||offset||' and rn<'||(offset+pagesize);
    open cur for sqlstr;
    loop
      fetch cur into v_col1,v_col2,v_col3;
      exit when cur%notfound;
      dbms_output.put_line(v_col1||'  '||v_col2||'  '||v_col3);
    end loop;
    close cur;
    end pro_test2;
    现在可以导入表名了
    dbms_output.put_line(v_col1||'  '||v_col2||'  '||v_col3);
    这个循环输出结果集
    不过表不确定的话还不能这么写..
    把结果导入一个临时表中如何?
    这样的话进行查询也比较方便
      

  6.   

    狂狼兄很强大啊,oracle 创建数据集的时候 是不是有一个表名%row_type的语句的,我想能不能遍历数据集取出所有数据或直接把数据集传出呢?哈哈,可能我也是异想天开,看来做到通用太难了
      

  7.   

    begin
    pro_delData('t_acl','402881e523cb81760123cb818d290053');
    end;
    错误报告:
    ORA-00972: 标识符过长
    ORA-06512: 在 "COLIN.PRO_DELDATA", line 4
    ORA-06512: 在 line 2
    00972. 00000 -  "identifier is too long"
    *Cause:    An identifier with more than 30 characters was specified.
    *Action:   Specify at most 30 characters.我把id改成了varchar2 的 结果出了这个问题,为什么呢
      

  8.   

    将整个数据集传出是可以的,只是处理是个问题,字段数都不知道
    create or replace procedure pro_test2(tabname in varchar2,pagesize in number,offset in number,order_col varchar2,order_mod varchar2,cur out sys_refcursor)
    as
    sqlstr varchar2(1000);
    v_col1 varchar2(100);
    v_col2 varchar2(100);
    v_col3 varchar2(100);
    begin
    sqlstr:='select col1,col2,col3 from(
        select t.*,row_number()over(order by '||order_col||' '||order_mod||')rn from '||tabname||' t)
        where rn>='||offset||' and rn<'||(offset+pagesize);
    open cur1 for sqlstr;
    end pro_test2;
    调用:
    declare
    cur1 sys_refcursor;
    begin
    pro_test2(tabname,pagesize,....,cur1);
    loop
    fetch cur1 into ....;
    exit when...;
    ...;
    end loop;
    close cur1;
    end;
      

  9.   

    错误提示不是说了吗
    输入的字符串过长
    '402881e523cb81760123cb818d290053'超过了30个字符
      

  10.   

    只要能返回结果集,那就好处理了,因为我是用java调用存储过程,只要能返回结果集就OK了,哈哈
    那么v_col1,v_col2,v_col3是不是就可以去掉了,返回整个结果集就行,我用java遍历很简单,多谢多谢
    太麻烦你了
      

  11.   

    关键我的ID是用字符串的,是UUID类型,一定是这么长的,而且传入的id值不应该限制长度吧
      

  12.   

    我java不熟悉,不过这里恐怕没那么简单,传出的是一个游标,得看你怎么处理了
    对于第一个问题,代码需要修改下..
    create or replace procedure pro_test1(tabname in varchar2,id in varchar2,flag out number)
    as
    begin
      execute immediate 'delete from '||tabname||' where id='''||id||'''';
      flag:=1;
    exception
      when others then
      flag:=2;
    end pro_test1;
    因为我原先以为id是数值型的..
    字符型的话需要在值上加引号
    在试试