为什么建包体时总提示“创建的包体带有编译错误”?
哪一点写错了?
--创建程序包
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;
哪一点写错了?
--创建程序包
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;
在sqlplus中执行,看语法对不对
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;
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--返回当前页数据记录
)