【发布时间】:2014-10-23 19:15:42
【问题描述】:
我正在尝试执行一个相当简单的功能。我想将主机名传递给该函数,我希望它获取该主机名并使用它来查找与该主机名关联的系统ID并返回它。
您将在下面看到我有一个 pl/sql 块正在调用一个名为 GET_SYSTEMID 的函数,当我将 varchar 传递给该函数时,我得到了一个错误返回。当我在函数中对相同的字符串进行硬编码时,我得到了正确的结果。保存主机名的列有一个唯一的约束,所以如果我使用我的一台服务器的确切主机名(我确定)应该只有一个匹配的行。
这是我的调用块:
Declare
sysid number;
Begin
sysid := Server.GET_SYSTEMID('MyHost');
DBMS_OUTPUT.PUT_LINE('SYSID is '||sysid);
END;
如果我使用那个块来调用这个函数它不起作用:
FUNCTION GET_SYSTEMID(Hostname varchar2)
RETURN NUMBER
IS
SysID number;
BEGIN
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;
return SysID;
END GET_SYSTEMID;
当我运行上述程序时,我收到以下错误消息:
Declare
sysid number;
Begin
sysid := Server.GET_SYSTEMID('MyHost');
DBMS_OUTPUT.PUT_LINE('SYSID is '||sysid);
END;
Error at line 3
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "MySchema.Server", line 33
ORA-06512: at line 12
接下来的两个确实可以工作,但是当他们对主机名进行硬编码时,他们不会做我需要这个函数来做的事情:
第一名:
FUNCTION GET_SYSTEMID(Hostname varchar2)
RETURN NUMBER
IS
SysID number;
tmp varchar2(8) := 'MyHost';--should be identical to passed in value
BEGIN
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = tmp;
return SysID;
END GET_SYSTEMID;
第二个:
FUNCTION GET_SYSTEMID(Hostname varchar2)
RETURN NUMBER
IS
SysID number;
BEGIN
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = 'MyHost';--should be identical to passed in value
return SysID;
END GET_SYSTEMID;
【问题讨论】:
-
可能是名称冲突。尝试重命名参数:
FUNCTION GET_SYSTEMID(p_Hostname varchar2) -
正如 Egor 所说,
mySystems.HOSTNAME = Hostname就像1=1,所以所有行都返回了! SQL 不区分大小写。
标签: oracle function plsql namespaces