小弟存储过程是小白,现需要两个存储过程第一个:传入表名 id 来删除该表的该条记录
第二个:传入表名,每页显示条数(pagesize,入5,10),起始条数(offset如10,20,30),排序字段名(order),排序方式(asc,desc)从而返回该表的结果集,如果排序字段为空则不排序,如果offset为空则全部返回(最好能为hibernate动态封装为某个领域模型,即在每个领域模型.htm.xml中配置该存储过程,并封装为该领域模型,如果太复杂也可不实现,我自己手动作就好)
各位大虾,多谢多谢,
第二个:传入表名,每页显示条数(pagesize,入5,10),起始条数(offset如10,20,30),排序字段名(order),排序方式(asc,desc)从而返回该表的结果集,如果排序字段为空则不排序,如果offset为空则全部返回(最好能为hibernate动态封装为某个领域模型,即在每个领域模型.htm.xml中配置该存储过程,并封装为该领域模型,如果太复杂也可不实现,我自己手动作就好)
各位大虾,多谢多谢,
解决方案 »
- linux下项目导出windows下的ORACL数据库的数据
- 基于时间的不完全备份 问题。
- 隆重推出最方便实用的国产免费的 Oracle 开发工具 - Oracle SQL Handler (免装客户端,跨平台能运行于LINUX及MAC,双语界面)
- 求救Io exception: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=169869568)错误
- Instant Client版本选择问题,求教!
- undo tablespace
- listener.ora and tnsnames.ora
- 如何创建关于主键的触发器
- 安装oracle8.17提示‘无法建立Inventory目录,你可能没有相应的权限’?是怎么回事?
- oracle 数据挖掘
- statspack看CUP使用率的问题
- 帮忙做一道PL/SQL题,急
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;
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;
加个异常段来处理
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;
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);
这个循环输出结果集
不过表不确定的话还不能这么写..
把结果导入一个临时表中如何?
这样的话进行查询也比较方便
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 的 结果出了这个问题,为什么呢
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;
输入的字符串过长
'402881e523cb81760123cb818d290053'超过了30个字符
那么v_col1,v_col2,v_col3是不是就可以去掉了,返回整个结果集就行,我用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是数值型的..
字符型的话需要在值上加引号
在试试