PL/SQL: PLS-00382: 表达式类型错误。语句被忽略
PL/SQL: PLS-00382: expression is of wrong type. Statement ignored
我有一个 'person' table 有两个字段 'person_name' 和 'person_age'.
我想写一个程序 return sys_refcursor 但要计算一个额外的字段 'is_old'。例如:
PROCEDURE people_load(p_name IN VARCHAR2, P_RESULT OUT SYS_REFCURSOR) IS
BEGIN
DECLARE
isOld BOOLEAN := false;
CURSOR cursorTemp IS SELECT person_name, person_age, is_old
WHERE person_name = p_name;
BEGIN
FOR _p IN cursorTemp
LOOP
IF _p.person_age > 75 THEN
_p.is_old:=TRUE;
END IF;
END LOOP;
¿¿P_RESULT:=cursorTemp; //open P_RESULT for (open cursorTemp);??
END;
END people_load;
我不知道如何将时间游标 'cursorTemp' 分配给 OUT 参数 'P_RESULT' 以 return 结果。
- 您不能在 SQL 中使用
BOOLEAN
,只能在 PL/SQL 中使用。
- 您不能遍历游标并重新计算列。
- 您声明了一个变量 isOld 并且从不使用它。
我建议你计算光标内的is_old。我将其更改为包含 1 (true) 或 0 (false)。
PROCEDURE people_load(p_name IN VARCHAR2, P_RESULT OUT SYS_REFCURSOR) IS
BEGIN
DECLARE
CURSOR cursorTemp IS SELECT person_name, person_age, case when person_age > 75 then 1 else 0 end is_old
WHERE person_name = p_name;
BEGIN
P_RESULT := cursorTemp; //open P_RESULT for (open cursorTemp);
END;
END people_load;
您应该在 select 中进行计算。
CURSOR cursorTemp IS
SELECT
person_name,
person_age,
CASE WHEN person_age>75 THEN 1 ELSE 0 END AS is_old
WHERE person_name = p_name;
我有一个 'person' table 有两个字段 'person_name' 和 'person_age'.
我想写一个程序 return sys_refcursor 但要计算一个额外的字段 'is_old'。例如:
PROCEDURE people_load(p_name IN VARCHAR2, P_RESULT OUT SYS_REFCURSOR) IS
BEGIN
DECLARE
isOld BOOLEAN := false;
CURSOR cursorTemp IS SELECT person_name, person_age, is_old
WHERE person_name = p_name;
BEGIN
FOR _p IN cursorTemp
LOOP
IF _p.person_age > 75 THEN
_p.is_old:=TRUE;
END IF;
END LOOP;
¿¿P_RESULT:=cursorTemp; //open P_RESULT for (open cursorTemp);??
END;
END people_load;
我不知道如何将时间游标 'cursorTemp' 分配给 OUT 参数 'P_RESULT' 以 return 结果。
- 您不能在 SQL 中使用
BOOLEAN
,只能在 PL/SQL 中使用。 - 您不能遍历游标并重新计算列。
- 您声明了一个变量 isOld 并且从不使用它。
我建议你计算光标内的is_old。我将其更改为包含 1 (true) 或 0 (false)。
PROCEDURE people_load(p_name IN VARCHAR2, P_RESULT OUT SYS_REFCURSOR) IS
BEGIN
DECLARE
CURSOR cursorTemp IS SELECT person_name, person_age, case when person_age > 75 then 1 else 0 end is_old
WHERE person_name = p_name;
BEGIN
P_RESULT := cursorTemp; //open P_RESULT for (open cursorTemp);
END;
END people_load;
您应该在 select 中进行计算。
CURSOR cursorTemp IS
SELECT
person_name,
person_age,
CASE WHEN person_age>75 THEN 1 ELSE 0 END AS is_old
WHERE person_name = p_name;