在oracle SQL中创建名为lastnamefirst的用户定义函数

时间:2018-11-13 19:04:22

标签: sql oracle

我正在使用oracle SQL开发人员。

我正在尝试创建一个函数,该函数将接受两个参数(名字和姓氏)并将它们作为一个变量返回,并且姓氏将首先显示。这是我的功能。

CREATE OR REPLACE FUNCTION LASTNAMEFIRST
(
varFirstName IN VARCHAR2,
varLastName IN VARCHAR2
)
RETURN VARCHAR2 AS 
BEGIN

DECLARE varFullName VARCHAR2;

DEFINE varFullName := CONCAT(varLastName,' ' ,varFirstName);

  RETURN varFullName;
END LASTNAMEFIRST; 

我在'end lastnamefirst'的分号处收到错误,“语法错误” 我一直在尝试改变小事情,每当我改变事物时,相同的错误就会出现在不同的地方。我在做什么错了?

3 个答案:

答案 0 :(得分:0)

语法错误。应该是

SQL> create or replace function lastnamefirst
  2    (varfirstname in varchar2,
  3     varlastname in varchar2)
  4  return varchar2
  5  as
  6  begin
  7    return varlastname||' '||varfirstname;
  8  end;
  9  /

Function created.

SQL> select lastnamefirst('Little', 'Foot') result from dual;

RESULT
------------------------------
Foot Little

SQL>

您的代码有什么问题?

  • 您不在体内DECLARE;如果您这样做,根本就没有DECLARE关键字,并且数据类型需要长度(例如VARCHAR2(30)
  • CONCAT仅接受两个参数;使用串联运算符,改为使用双管道||
  • PL / SQL中没有DEFINE

答案 1 :(得分:0)

我希望Oracle语法看起来更像:

CREATE OR REPLACE FUNCTION LASTNAMEFIRST (
   in_FirstName IN VARCHAR2,
   in_LastName IN VARCHAR2
)
RETURN VARCHAR2 AS
    v_FullName varchar2(4000);
BEGIN
    v_FullName := in_LastName || ' ' || in_FirstName;

    RETURN v_FullName;
END;  --  LASTNAMEFIRST; 

这当然可以简化(例如,不使用局部变量),但是它遵循代码的逻辑。

答案 2 :(得分:0)

使用您所在的DECLARE本质上是开始一个新的代码块,这会导致您看到错误。在代码中,如果将变量声明移到DECLARE之前,则BEGIN是不必要的。 DEFINE也无效。这样的事情应该起作用:

CREATE OR REPLACE FUNCTION LASTNAMEFIRST
(
varFirstName IN VARCHAR2,
varLastName IN VARCHAR2
)
RETURN VARCHAR2 AS 
   varFullName VARCHAR2(100);
BEGIN
  varFullName := varLastName || ' ' || varFirstName;
  RETURN varFullName;
END LASTNAMEFIRST;

可以通过完全删除变量声明来进一步简化:

CREATE OR REPLACE FUNCTION LASTNAMEFIRST
(
varFirstName IN VARCHAR2,
varLastName IN VARCHAR2
)
RETURN VARCHAR2 AS 
BEGIN
  RETURN varLastName || ' ' || varFirstName;
END LASTNAMEFIRST;