这个 Oracle 函数该怎么做??急!!

neweb 2001-11-16 11:03:26
我想建个这样的函数:传入一个表名、一个字段名,返回该表中该字段的最大值。

create or replace function GetMaxID(TableName varchar2,FieldName varchar2) return number is
MaxID number;
begin
select max(:FieldName) into MaxID from :TableName;
return(MaxID);
end GetMaxID;

上面的代码行不通,请教大吓应该怎么写??
...全文
103 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
neweb 2001-11-19
  • 打赏
  • 举报
回复
KingSunSha(弱水三千), 谢谢你的热心帮助。
KingSunSha 2001-11-18
  • 打赏
  • 举报
回复
在下面这两个贴子有完整的PACKAGE/PACKAG BODY的示例,请参考。
http://www.csdn.net/expert/topic/338/338638.shtm
http://www.csdn.net/expert/Topic/371/371482.shtm
KingSunSha 2001-11-18
  • 打赏
  • 举报
回复
CREATE OR REPLACE PACKAGE BODY PKG_TEST AS
....
FUNCTION TEST1(...) RETURN VARCHAR2 IS
.....
END TEST1;

FUNCTION TEST2(...) RETURN VARCHAR2 IS
.....
END TEST2;

END PKG_TEST;
/
neweb 2001-11-18
  • 打赏
  • 举报
回复
成功了。KingSunSha(弱水三千):你得分了。

我多做了个 package body, 删掉就行了。如果不用 package 的话,我见到过这样的符号:
=> :TableName ,不知能不能用上,怎么用?

另外,如果把函数做到 package body 里,body 最后的 begin 和 end bodyname;之间的代码该怎么写?
KingSunSha 2001-11-17
  • 打赏
  • 举报
回复
修正一下,最好在fech cursor以后关掉
open w_cur for w_sql;
fetch w_cur into maxid;
close w_cur;
guostong 2001-11-17
  • 打赏
  • 举报
回复
使用动态游标
KingSunSha 2001-11-17
  • 打赏
  • 举报
回复
你这么写肯定不行,我试了一下,结果是成功了,但不一定是最好的办法。

CREATE OR REPLACE
package pkg_test as
type myrctype is ref cursor;
end pkg_test;
/

CREATE
function GetMaxID(TName varchar2,FieldName varchar2) return number is
w_sql varchar2(255);
MaxID number;
w_cur pkg_test.myrctype;
begin
w_sql := 'select max(' || FieldName || ') from '|| TName ;

open w_cur for w_sql;
fetch w_cur into maxid;

return maxID;
end GetMaxID;
/

SQL> select max(id) from mytable;

MAX(ID)
----------
15

SQL> select getmaxid('MYTABLE','ID')
2 from dual;

GETMAXID('MYTABLE','ID')
------------------------
15
KingSunSha 2001-11-17
  • 打赏
  • 举报
回复
没有成功?不可能啊?在8.16上调试成功了。
关于w_cur pkg_test.myrctype; --》myCur pkg_MaxID.RefCur;只要你改了相应的PACKAGE就不是问题,但看报错信息应该是你没有正确生成PKG_MAXID或者在这个PKG中没有正确定义类型REFCUR。

1、其实PACKAGE只起到了类型说明的作用,不用PACKAGE的办法我一时没想到
2、if myCur%NOTFOUND then Result := 0;end if;意思不错,但是RESULT没有定义。其实你可以通过判断maxid来做,把return maxID; 改成RETURN NVL(MAXID,0);不是更简洁吗?
neweb 2001-11-17
  • 打赏
  • 举报
回复
好象很高明呵,不过在我的9i上没有成功,这句我改了
w_cur pkg_test.myrctype; --》myCur pkg_MaxID.RefCur;
报错:必须说明标识符“PKG_MAXID.REFCUR”
星期一到公司的8.0.5上再试试

另外,1. 能否不用 Package?
2. 加一句 if myCur%NOTFOUND then Result := 0;end if; 有错吗?

2,598

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧