开发者社区> 泡泡浅眠> 正文

折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)

简介:
+关注继续查看

说明:

为了让CYQ.Data 框架支持Oracle,这几天对Oracle进行了基本探索,并把中间遇到的问题轻轻的记录了下来,与大伙共享。

 

 

总共有三篇:

1:初折腾Oracle问题小记

2:初折腾Oracle问题小记二

3:就是本篇了:折腾Oracle问题小菜记(三)

 

本篇又有新突破,再记录一下:

 

1:自己写了一条分页存储过程,也是CYQ.Data默认产生的存储过程:

 

复制代码
create or replace package MyPackage as 
type MyCursor 
is ref cursor;
procedure SelectBase(pageIndex int,pageSize int,tableName varchar2,whereStr varchar2,
  resultCount out 
int, resultCursor out MyCursor);
end MyPackage;

create or replace package Body MyPackage is
procedure SelectBase(pageIndex int,pageSize int,tableName varchar2,whereStr varchar2,
  resultCount out 
int, resultCursor out MyCursor)
  
is
  
--定义变量
  newtableName varchar2(4000);
  rowStart  
int;
  rowEnd    
int;
  mySql 
varchar2(8000);
  whereOnly 
varchar2(8000);
  OrderOnly 
varchar2(400);
  
begin
    newtableName:
=tableName;
    mySql:
='select count(*) from '||tableName;

    
    
if whereStr is not null and length(whereStr)>0
      
then
          rowStart:
=instr(whereStr,'order by');
         
if rowStart>0 
          
then
            whereOnly:
=substr(whereStr, 1,rowStart-1);    --取得条件 
            OrderOnly:=substr(whereStr,rowStart, length(whereStr)-rowStart+1);    --取得排序方式(order by 字段 方式) 
          else
            whereOnly:
=whereStr;
            OrderOnly:
='';
            
end if;
           whereOnly:
=' where '|| whereOnly;
           mySql:
=mySql||whereOnly;
         
     
end if;
     
execute immediate mySql into resultCount;
       
-- dbms_output.put_line('查询总条数SQL=>'||whereStr||'--'||mySql||resultCount); 
    --执行查询,查询总条数 
           


            
--不分页查所有
          
        
if pageIndex=0 and pageSize=0    
        
then 
        mySql:
='select * from '||tableName||whereOnly||OrderOnly;
       
else
--计算起始和结束索引

        rowStart:
=(pageIndex-1)*pageSize+1
        rowEnd:
=rowStart+pageSize-1;
        mySql:
='select * from (select t.*,RowNum as rn from (select * from '||newtableName||whereOnly||OrderOnly||') t) where rn between '||rowStart||' and '||rowEnd;
      
        
end if;
    
open ResultCursor for mySql;
   
--dbms_output.put_line('SQL=>'||mySql); 
    end SelectBase;
  
end MyPackage;
复制代码

 

执行测试语句:

复制代码
 declare
  ResultCursor MyPackage.MyCursor;
  ResultCount 
int;
  
begin
  MyPackage.SelectBase(
1,2,'USERS','id>1 order by id',ResultCount,ResultCursor);
  
end;
复制代码

 

说明:

为写这段存储过程历经了半天,需要看语法,又要调试,最后采用步步注释法才一条语句一条语句的写到最后。
测试调试也弄了半天,要定义游标传进去才行。

 

继续说明:

复制代码
ExpandedBlockStart.gif
Oracle里的存储过程的可以有Package,等于一个名称空间了。

存储过程的代码里面有几个小问题,oracle->比较->mssql:

1:|| 为链接符号即+号

2:instr 函数和sql的函数charindex函数一样,只是里面的头两个参数的顺序要反过来。

3:substr函数和sql的函数substring函数一样。

4:length函数和sql的函数len函数一样。

5:if ...then...else end if,   mssql里为 if begin end

6:“;"号一行语句一个,mssql里没有。
复制代码

 

 

 

 

2:数据库表/视图的字段结构查询:

复制代码
ExpandedBlockStart.gif
select COLUMN_NAME as ColumnName,
Data_length
*2 as MaxSize,
case NULLABLE when 'Y' then 1 else 0 end as IsNullable,
0 as ReadOnly,
DATA_TYPE 
as SqlType
from USER_TAB_COLS where TABLE_NAME=upper(:TableName) order by COLUMN_ID
复制代码

 

3:存储过程参数放在另一个表,独立查询:

select argument_Name as ColumnName,-1 as MaxSize,0 as IsNullable,0 as ReadOnly,'int' as SqlType from user_arguments where object_name=upper(:TableName)

 

4:查询所有表/视图/存储过程

ExpandedBlockStart.gif
Select object_name From user_objects Where object_type='TRIGGER'--所有触发器
Select object_name From user_objects Where object_type='PROCEDURE'--所有存储过程
Select object_name From user_objects Where object_type='VIEW'--所有视图
Select object_name From user_objects Where object_type='TABLE'--所有表

 

 

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/09/28/1837692.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
sql创建临时表或视图增加 自增列
select row_number()over(order by [createtime] asc) ida,* from [Opro].[dbo].[DailyReport2010])
783 0
EMR Spark Relational Cache 利用数据预组织加速查询
本文介绍了EMR Spark的Relational Cache如何从数据量较大的Cube中快速提取出所需数据加速查询的原理。通过列式存储、文件索引、Z-Order等技术,我们可以快速过滤数据,大大减少实际发生的IO数据量,避免IO瓶颈的出现,从而优化整体查询性能。
1009 0
SSM框架之关于使用JSP作为视图展示问题解决方案
JSP作为视图层展示数据,已经有很长一段时间了,不管是在校学习还是企业工作,总会或多或少接触这个。特别是对于一些传统中小型或者一些几年前的企业而言,有很多使用JSP作为视图展示层。 JSP本质是就是Servlet,Servlet可以说也是JSP。
1640 0
手动绑定SQLDataSource到GridView后分页的问题(转)
由于GridView的数据源是后台CS文件中代码绑定的。所以程序运行时,点击分页数后没有反应。解决办法如下: using System;using System.Data;using System.Configuration;using System.
746 0
NodeJs操作MongoDB之分页功能与常见问题
NodeJs操作MongoDB之分页功能与常见问题一,方法介绍 1,聚合操作之count count()方法可以查询统计符合条件的集合的总数 1 db.User.count() // 此方法等价于 db.User.find().count()在分布式集合中,会出现计算错误的情况,这个时候推荐使用aggregate; 2,find() 方法以非结构化的方式来显示所有文档。
1486 0
+关注
2246
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载