create or replace procedure Page
(
strwhere in  varchar2,
 startIndex in  binary_integer,
 endIndex in  binary_integer
)
IS
BEGINstrSQL  varchar2;
set strSQL='with temp as ('+strwhere+')';
set strSQL=strSQL+'select * from temp where row between '+convert(varchar2,startIndex)+' and '+convert(varchar2,endIndex);
exec(strSQL);
end;
为什么会抱这样的错误 弄不明白  
刚学 不是很明白

解决方案 »

  1.   

    Oracle连接字串用|| 不用+
      

  2.   

    语法不一样,sql server的写法行不通.
      

  3.   

    执行用 execute immediate strSQL;
      

  4.   

    create or replace procedure 过程名(参数列表)
    IS
    存储过程局部变量列表;
    BEGIN
    execute immediate 'sql语句';
    end;
    另外看你的需求,需要用 sys_refcursor做出参.会用到动态cursor. open cursorname for 'sql语句'
      

  5.   


    --编译通过
    create or replace procedure Page
    (
     strwhere in varchar2,
     startIndex in binary_integer,
     endIndex in binary_integer
    )
    IS
    strSQL varchar2(100);
    BEGIN
         strSQL:='with temp as ('||strwhere||')';
         strSQL:=strSQL+'select * from emp where sal between '||startIndex||' and '||endIndex;
         execute immediate strSQL;
    end;
    /
      

  6.   

    oracle分页可以参考下下面的.
    分析函数及分页
    首先用sys用户unlock系统自带的scott用户
    alter user scott account unlock;
    然后使用scott登录以下用scott用户下自带的表演示分析函数功能
    ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序 
    而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的) RANK() 类似,不过RANK 排序的时候跟派名次一样,可以并列2个第一名之后 是第3名 LAG 表示 分组排序后 ,组内后面一条记录减前面一条记录的差,第一条可返回 NULL BTW: EXPERT ONE ON ONE 上讲的最详细,还有很多相关特性,文档看起来比较费劲row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序) 
    rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) 
    dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。 
    相比之下row_number是没有重复值的 
    lag(arg1,arg2,arg3): 
    arg1是从其他行返回的表达式 
    arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,表示向前面第几行取arg1 
    arg3是在arg2无法匹配时的取值。 
    SQL> set pagesize 100; 
    SQL> select rownum from emp; ROWNUM 
    ---------- 









    10 
    11 
    12 
    13 
    14 已选择14行。 已用时间: 00: 00: 00.10 
    SQL> select deptno,row_number() over(partition by deptno order by sal) from emp order by deptno; 
    DEPTNO ROW_NUMBER()OVER(PARTITIONBYDEPTNOORDERBYSAL) 
    ---------- --------------------------------------------- 
    10 1 

    3 20 1 



    5 30 1 





    已选择14行。 已用时间: 00: 00: 00.41 
    SQL> select deptno,rank() over (partition by deptno order by sal) from emp order by deptno; DEPTNO RANK()OVER(PARTITIONBYDEPTNOORDERBYSAL) 
    ---------- --------------------------------------- 
    10 1 

    3 20 1 



    4 30 1 





    已选择14行。 已用时间: 00: 00: 00.21 
    SQL> select deptno,dense_rank() over(partition by deptno order by sal) from emp order by deptno; DEPTNO DENSE_RANK()OVER(PARTITIONBYDEPTNOORDERBYSAL) 
    ---------- --------------------------------------------- 
    10 1 

    3 20 1 



    4 30 1 





    已选择14行。 已用时间: 00: 00: 00.20 
    SQL> select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) from emp ord 
    er by deptno; DEPTNO ENAME SAL LAG(ENAME, 
    ---------- ---------- ---------- ---------- 
    10 CLARK 2450 
    KING 5000 CLARK 
    MILLER 1300 KING 20 ADAMS 1100 
    FORD 3000 ADAMS 
    JONES 2975 FORD 
    SCOTT 3000 JONES 
    SMITH 800 SCOTT 30 ALLEN 1600 
    BLAKE 2850 ALLEN 
    JAMES 950 BLAKE 
    MARTIN 1250 JAMES 
    TURNER 1500 MARTIN 
    WARD 1250 TURNER 
    已选择14行。 已用时间: 00: 00: 00.31 
    SQL> select deptno,ename,sal,lag(ename,2,'example') over(partition by deptno order by ename) from em 
    p order by deptno; DEPTNO ENAME SAL LAG(ENAME, 
    ---------- ---------- ---------- ---------- 
    10 CLARK 2450 example 
    KING 5000 example 
    MILLER 1300 CLARK 20 ADAMS 1100 example 
    FORD 3000 example 
    JONES 2975 ADAMS 
    SCOTT 3000 FORD 
    SMITH 800 JONES 30 ALLEN 1600 example 
    BLAKE 2850 example 
    JAMES 950 ALLEN 
    MARTIN 1250 BLAKE 
    TURNER 1500 JAMES 
    WARD 1250 MARTIN 已选择14行。  将分析函数应用于分页
    大多数人只知道用rownum 配合l嵌套来分页,效率低,麻烦。 
    下面先用rownum分页再用row_number函数进行分页
    --创建环境
    create table T_NEWS 

      ID      NUMBER, 
      N_TYPE  VARCHAR2(20), 
      N_TITLE VARCHAR2(30), 
      N_COUNT NUMBER 


    prompt Disabling triggers for T_NEWS... 
    alter table T_NEWS disable all triggers; 
    prompt Loading T_NEWS... 
    insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) 
    values (1, 'IT', '爱it1', 100); 
    insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) 
    values (2, '体育', '爱体育1', 10); 
    insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) 
    values (3, '体育', '爱体育2', 30); 
    insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) 
    values (4, 'IT', '爱it2', 300); 
    insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) 
    values (5, 'IT', '爱it3', 200); 
    insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) 
    values (6, '体育', '爱体育3', 20); 
    insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) 
    values (7, '体育', '爱体育4', 60); 
    commit; 
    第一步:我先用rownum --分页 row_number,不是rownum 
    --根据n_count从大到小排列,每页3条 
    SELECT ROWNUM r,t.* FROM t_news t 
    WHERE ROWNUM<=3 
    ORDER BY t.n_count DESC 
    --问题:为什么order by以后,行号是乱的? 
    SELECT ROWNUM r,t.* FROM t_news t 
    --原因:先分配了行号,再根据n_count排序 --所以必须排序,再生成行号 
    SELECT ROWNUM r,t.* FROM ( 
       SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t --分页 
    --err 
    SELECT ROWNUM r,t.* FROM ( 
       SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t 
    WHERE r between 1 AND 3 --第1页 
    SELECT ROWNUM r,t.* FROM ( 
       SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t 
    WHERE ROWNUM between 1 AND 3 --第2页 
    SELECT ROWNUM r,t.* FROM ( 
       SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t 
    WHERE ROWNUM between 4 AND 6 
    --error: ROWNUM必须从1开始! 
    SELECT k.* FROM ( 
    SELECT ROWNUM r,t.* FROM ( 
       SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t 
    ) k 
    WHERE r BETWEEN 4 AND 6 --麻烦,效率低! 
    *****第二步:我用row_number() over()函数 
    select t2.* from 
        (select t.*,row_number()over(order by t.n_count desc) orderNumber from t_news t order by t.n_count desc)t2 where orderNumber  between 1and 3; 
    *****************************************************************************************************************************************88 
    SELECT * FROM ( 
      SELECT  t.*,row_number() over(ORDER BY n_count DESC) r 
      FROM t_news t 
      ORDER BY t.n_count DESC 
    ) t 
    WHERE r BETWEEN 4 AND 6 --通用语法: 解析函数() over(partition by 字段  order by 字段)