为什么建包体时总提示“创建的包体带有编译错误”?
哪一点写错了?
--创建程序包
CREATE or REPLACE PACKAGE LingC --程序包名称
IS
TYPE type_cur IS REF CURSOR; --定义游标变量用于返回记录集PROCEDURE LingCSplitPage(
 lTable in VARCHAR2, --要查询的表
 lPrimaryKey VARCHAR2, --表的主键
 lSort in VARCHAR2, --排序(如:id desc,注意,不须要带'order by')
 lFields in VARCHAR2, --要返回的字段('*'为所有,多个字段用','分隔)
 lFilter in VARCHAR2, --过滤条件(不带Where,如"id=3 and name='admin'")
 lPageIndex in NUMBER, --页索引
 lPageSize in NUMBER, --页大小
 lRowCount out NUMBER, --返回分页总数
 lCur out type_cur --返回当前页数据记录
);END LingC;
--***********************************************************************
--创建程序包内容(分页存储过程)
CREATE or REPLACE PACKAGE BODY LingC
IS
PROCEDURE LingCSplitPage(
 lTable in VARCHAR2, --要查询的表或视图
 lPrimaryKey VARCHAR2, --表的主键
 lFields in VARCHAR2, --要返回的字段('*'为所有,多个字段用','分隔)
 lFilter in VARCHAR2, --过滤条件(不带Where,如"id=3 and name='admin'")
 lPageIndex in NUMBER, --页索引
 lPageSize in NUMBER, --页大小
 lPageCount out NUMBER, --返回分页总数
 lCur out type_cur --返回当前页数据记录
)
AS
 vRecordCount NUMBER; --用于保存表中记录总数
 vSqlStr VARCHAR(400); --保存动态生成的SQL语句
 vMax NUMBER; --最大行号
 vMin NUMBER; --最小行号
BEGIN
----------------------------------获得分页总数
IF lFilter<>'' THEN
 vSqlStr := 'select count(*) from ' || lTable;
ELSE
 vSqlStr := 'select count(*) from ' || lTable || 'where ' || lFilter;
END IF
EXECUTE IMMEDIATE vSqlStr INTO vRecordCount;
lPageCount := ceil(vRecordCount/lPageSize);
----------------------------------显示页内容
vMax := lPageIndex * lPageSize + lPageSize;
vMin := vMax - lPageSize +1;
vSqlStr := 'select ' || lField || ' from ' || lTable;
IF lFilter<>'' THEN
 vSqlStr := vSqlStr || ' where ' || lFilter;
 vSqlStr := vSqlStr || ' and ' || lPrimaryKey || ' not in(';
 vSqlStr := vSqlStr || 'select ' || lPrimaryKey || ' where rownum< ' || vMin;
 vSqlStr := vSqlStr || ') and rownum<=' || lPageSize;
ELSE
 vSqlStr := vSqlStr || ' where ' || lPrimaryKey || ' not in(';
 vSqlStr := vSqlStr || 'select ' || lPrimaryKey || ' where rownum< ' || vMin;
 vSqlStr := vSqlStr || ') and rownum<=' || lPageSize;
END IF
OPEN lCur FOR vSqlStr;
END LingCSplitPage;
END LingC;

解决方案 »

  1.   

    oracle的存储过程返回结果集不能用直接开cursor的方法
      

  2.   

    在Pl/SQL develop中那一行又错误,会有提示的
      

  3.   

    在打开游标前,最好把你的sql语句打印出来
    在sqlplus中执行,看语法对不对
      

  4.   

    PROCEDURE LingCSplitPage(
     lTable in VARCHAR2, --要查询的表或视图
     lPrimaryKey VARCHAR2, --表的主键
     lFields in VARCHAR2, --要返回的字段('*'为所有,多个字段用','分隔)
     lFilter in VARCHAR2, --过滤条件(不带Where,如"id=3 and name='admin'")
     lPageIndex in NUMBER, --页索引
     lPageSize in NUMBER, --页大小
     lPageCount out NUMBER, --返回分页总数
     lCur out type_cur --返回当前页数据记录
    )
    AS
     vRecordCount NUMBER; --用于保存表中记录总数
     vSqlStr VARCHAR(400); --保存动态生成的SQL语句
     vMax NUMBER; --最大行号
     vMin NUMBER; --最小行号
    BEGIN
    ----------------------------------获得分页总数
    IF lFilter<>'' THEN
     vSqlStr := 'select count(*) from ' || lTable;
    ELSE
     vSqlStr := 'select count(*) from ' || lTable || 'where ' || lFilter;
    END IF;  ----缺分号
    EXECUTE IMMEDIATE vSqlStr INTO vRecordCount;
    lPageCount := ceil(vRecordCount/lPageSize);
    ----------------------------------显示页内容
    vMax := lPageIndex * lPageSize + lPageSize;
    vMin := vMax - lPageSize +1;
    vSqlStr := 'select ' || lFields || ' from ' || lTable;  --lFileds不是lField
    IF lFilter<>'' THEN
     vSqlStr := vSqlStr || ' where ' || lFilter;
     vSqlStr := vSqlStr || ' and ' || lPrimaryKey || ' not in(';
     vSqlStr := vSqlStr || 'select ' || lPrimaryKey || ' where rownum< ' || vMin;
     vSqlStr := vSqlStr || ') and rownum<=' || lPageSize;
    ELSE
     vSqlStr := vSqlStr || ' where ' || lPrimaryKey || ' not in(';
     vSqlStr := vSqlStr || 'select ' || lPrimaryKey || ' where rownum< ' || vMin;
     vSqlStr := vSqlStr || ') and rownum<=' || lPageSize;
    END IF;   --缺分号
    OPEN lCur FOR vSqlStr;
    END LingCSplitPage;
      

  5.   

    谢谢genphone_ru,谢谢各位,我再去试试啊。一会就回来。
      

  6.   

    genphone_ru,不行啊。那个问题是解决了,但是现在又提示,创建的包体有编译错误。晕
      

  7.   

    包头和包体的参数不一致PROCEDURE LingCSplitPage(
     lTable in VARCHAR2,--要查询的表
     lPrimaryKey VARCHAR2,--表的主键
     lSort in VARCHAR2,--排序(如:id desc,注意,不须要带'order by')
     lFields in VARCHAR2,--要返回的字段('*'为所有,多个字段用','分隔)
     lFilter in VARCHAR2,--过滤条件(不带Where,如"id=3 and name='admin'")
     lPageIndex in NUMBER,--页索引
     lPageSize in NUMBER,--页大小
     lRowCount out NUMBER,--返回分页总数
     lCur out type_cur--返回当前页数据记录
    );
    PROCEDURE LingCSplitPage(
     lTable in VARCHAR2,--要查询的表或视图
     lPrimaryKey VARCHAR2,--表的主键
     lFields in VARCHAR2,--要返回的字段('*'为所有,多个字段用','分隔)
     lFilter in VARCHAR2,--过滤条件(不带Where,如"id=3 and name='admin'")
     lPageIndex in NUMBER,--页索引
     lPageSize in NUMBER,--页大小
     lPageCount out NUMBER,--返回分页总数
     lCur out type_cur--返回当前页数据记录
    )