我正在尝试编写PL SQL函数,但是我在格式化和一般语法方面遇到了一些问题。
这是我目前的代码:
create or replace function getName(name IN varchar, organisation OUT varchar,
xcoord OUT number, ycoord OUT number, errormsg OUT varchar)
return varchar2
as
begin
Select name, LOCX, LOCY
from BBT_POI
WHERE (UPPER(name) LIKE UPPER('%'|| NAME || '%'));
return NAME;
end;
/
variable input varchar;
Variable errormsg varchar;
Variable organisation varchar;
Variable x NUMBER;
Variable y NUMBER;
execute getName ('yach', organisation, x, y, errormsg);
这些是我运行create或replace function命令时的错误消息:
FUNCTION GETNAME compiled
Errors: check compiler log
错误(5,3):PLS-00428:此SELECT语句中需要INTO子句
当我运行执行行时,我得到了这个:
Error starting at line : 40 in command -
execute getName ('yach', organisation, x, y, errormsg)
Error report -
ORA-06550: line 1, column 24:
PLS-00201: identifier 'ORGANISATION' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
该过程应采用一个IN参数(名称或名称的一部分),并返回四个OUT参数(组织名称,X-coord,Y-coord,错误消息(或' none&#39) ;如果没有抛出错误消息))。
我知道目前代码并没有查找错误,但我只是想让一个简单的版本工作,我可以添加更多功能。
答案 0 :(得分:2)
您的代码存在以下几个问题:
首先,您遇到PLS-00428
错误,这意味着您没有给出INTO
条款
例如:
create or replace function getName(name IN varchar, organisation OUT varchar,
xcoord OUT number, ycoord OUT number, errormsg OUT varchar)
return varchar2
as
begin
Select name, LOCX, LOCY
INTO name, XCOORD, YCOORD -- I assume this is how you need them kept
from BBT_POI
WHERE (UPPER(name) LIKE UPPER('%'|| NAME || '%'));
return NAME;
end;
/
接下来,您的下一个块必须定义为匿名块。 Oracle不知道您正在尝试使用PL / SQL,除非您明确告诉它 所以你的变量东西需要在一个块中(你也不需要说变量):
DECLARE
input varchar;
errormsg varchar;
organisation varchar;
x NUMBER;
y NUMBER;
BEGIN
getName('yach', organisation, x, y, errormsg);
END;
/
答案 1 :(得分:1)
我现在没有工具来检查它是否有效,但试试这个:
create or replace function getName(p_name IN varchar, organisation OUT varchar,
xcoord OUT number, ycoord OUT number, errormsg OUT varchar)
return varchar2
as
begin
Select name, LOCX, LOCY
INTO p_name, xcoord, coord
from BBT_POI
WHERE (UPPER(p_name) LIKE UPPER('%'|| p_name || '%'));
return p_name;
end;
/
declare
input varchar;
errormsg varchar;
organisation varchar;
x NUMBER;
y NUMBER;
begin
input:=getName ('yach', organisation, x, y, errormsg);
end;