Pl/SQL函数语法

Pl/SQL函数语法,sql,oracle,plsql,Sql,Oracle,Plsql,我不能用pl/SQL来处理函数,我有一些代码应该用来检查房间容量,但我想我在某个地方声明了一个错误的变量。老实说,我看不出有什么问题 CREATE OR REPLACE Function RoomCapacity ( name_in IN varchar2 ) RETURN varchar2 IS R_value number(6); RLevel varchar2(20); cursor c1 is SELECT room_capacity FROM ROOMS WHERE ro

我不能用pl/SQL来处理函数,我有一些代码应该用来检查房间容量,但我想我在某个地方声明了一个错误的变量。老实说,我看不出有什么问题

CREATE OR REPLACE Function RoomCapacity
( name_in IN varchar2 )
RETURN varchar2
IS
R_value number(6);
RLevel varchar2(20);

cursor c1 is
  SELECT room_capacity
  FROM ROOMS
  WHERE room_id = name_in;

BEGIN

open c1;
fetch c1 into R_value;
close c1;

IF R_value <= 10 THEN
  RLevel := 'Low capacity';

ELSIF R_value > 10 and R_value <= 18 THEN
  RLevel := 'Avg capacity';

ELSIF R_value > 18 and R_value <= 30 THEN
  RLevel := 'Moderate capacity room';

ELSE
  RLevel := 'High capacity room';

END IF;

RETURN RLevel;

END;

ROOM_ID
BUILDING_PREFIX
ROOM_FLOOR
ROOM_NUMBER
ROOM_TYPE
ROOM_CAPACITY
ROOM_EQUIPMENT
创建或替换功能室容量
(varchar2中的名称)
返回varchar2
是
R_值编号(6);
勒维尔·瓦尔查尔2(20);
光标c1为
选择房间容量
从房间
其中,房间id=房间中的名称;
开始
开c1;
取c1为R_值;
关闭c1;
如果R_值10和R_值18以及R_值我看不出任何错误。
此外,我还尝试了你的代码,效果非常好,
看这把小提琴:


但是,可以使用大小写表达式简化函数,只需:

   RETURN
   CASE WHEN R_value <= 10 THEN 'Low capacity'
        WHEN R_value > 10 AND R_value <= 18 THEN 'Avg capacity'
        WHEN R_value > 18 AND R_value <= 30 THEN  'Moderate capacity room'
        ELSE 'High capacity room'
   END;
返回
当R_值10和R_值18以及R_值时,我看不到任何错误。
此外,我还尝试了你的代码,效果非常好,
看这把小提琴:


但是,可以使用大小写表达式简化函数,只需:

   RETURN
   CASE WHEN R_value <= 10 THEN 'Low capacity'
        WHEN R_value > 10 AND R_value <= 18 THEN 'Avg capacity'
        WHEN R_value > 18 AND R_value <= 30 THEN  'Moderate capacity room'
        ELSE 'High capacity room'
   END;
返回

当R_值10和R_值18以及R_值时,代码看起来很好,只有一个例外,您的变量定义

RLevel varchar2(20);
以及:


ELSIF R_值>18和R_值代码看起来很好,只有一个例外,您的变量定义

RLevel varchar2(20);
以及:


ELSIF R_值>18和R_值So。。。。你犯了什么错误?因为代码看起来很合理-假设客户端传入的名称与房间id正确匹配。哦,如果房间的房间容量在19到30之间,那么文本字符串将放大您的varchar2(20)RLevel参数(“中等容量房间”有23个字符!).这一行是否正确?你能详细说明一下你的代码是如何“不起作用”的吗?你在期待什么,到底发生了什么?如果您遇到异常或错误,请发布发生的行和详细信息。请将这些详细信息输入,否则我们可能无法提供帮助。因此。。。。你犯了什么错误?因为代码看起来很合理-假设客户端传入的名称与房间id正确匹配。哦,如果房间的房间容量在19到30之间,那么文本字符串将放大您的varchar2(20)RLevel参数(“中等容量房间”有23个字符!).这一行是否正确?你能详细说明一下你的代码是如何“不起作用”的吗?你在期待什么,到底发生了什么?如果您遇到异常或错误,请发布发生的行和详细信息。请输入这些详细信息,否则我们可能无法提供帮助。您的测试用例不包括那些试图将“中等容量空间”放入RLevel varchar2(20);…;-)@Michael,感谢您指出这一点-请将此作为答案发布,因为这是问题的真正原因(“中等容量空间”不适合varchar(20)`)完成-很高兴能够提供帮助:)您的测试用例不包括那些试图将“中等容量空间”放入RLevel varchar2(20);……;-)@Michael,感谢您指出这一点-请将此作为答案发布,因为这是问题的真正原因(“中等容量房间”不适合varchar(20)`)完成-很高兴能够提供帮助:)