【问题标题】:PL SQL function problemsPL SQL 函数问题
【发布时间】:2015-04-21 12:30:28
【问题描述】:

我正在尝试编写一个 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);

这些是我运行创建或替换功能命令时的错误消息:

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 坐标、Y 坐标、错误消息(如果没有错误消息,则返回 'none'被抛出))。

我知道目前代码不会查找错误,但我只是想让一个简单的版本正常工作,之后我可以添加更多功能。

【问题讨论】:

  • PL/SQL 真的可以与 MySQL 一起使用吗?考虑改为标记 Oracle?
  • 错误很明显。您需要一个into 子句、一个变量,并在return 语句中使用这个变量。

标签: sql oracle function plsql


【解决方案1】:

您的代码存在几个问题: 首先,您遇到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;
/

【讨论】:

    【解决方案2】:

    我现在没有工具来检查它是否确实有效,但试试这个:

    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;
    

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      相关资源
      最近更新 更多