1

我正在尝试为动态操作编写以下 PL/SQL 函数体

动态动作的目的是根据输入参数为文本区域设置值。我尝试这样做的方式是将值设置为不同选项的变量

declare

P_NOTE varchar(100);  -- derive value
P_WEBSERVER varchar(100);  -- derive name

begin

-- for getting the P_NOTE value
select distinct note into P_NOTE  from port_mapping where PLATFORM = :P3_PLATFORM and VERSION = :P3_VERSION;

-- for getting web server value
select CONCAT(P_NOTE,CONCAT('https-',:P3_CLIENT)) into P_WEBSERVER from dual order by 1;

if (:P3_PLATFORM = 'Apache') then
    return P_WEBSERVER;
end if;

end;

但是我收到错误

ORA-06550:第 15 行,第 5 列:PLS-00372:在过程中,RETURN 语句不能包含表达式 ORA-06550:第 15 行,第 5 列:PL/SQL:语句被忽略

  1. 宣布
  2. P_NOTE varchar(100);
  3. P_WEBSERVER varchar(100);

我不确定我错过了什么。

4

2 回答 2

3

(由于您没有发布任何 apex 版本,因此此解释涉及版本 4.2)


如果这是一个动态操作,并且您发布的代码是“执行 PL/SQL 代码”类型的真实操作,那么您不能使用RETURN. plsql 块不是函数体(关闭,Kemp 先生!)。
如果要将会话状态中的值返回到页面项,则需要使用 true 操作的“要返回的页面项”项。 在动态动作中执行 plsql 代码 这会将定义的页面项目的会话状态放入页面上项目的值。这意味着您不能使用任何变量来将内容放入以便能够将其返回到页面,但是您需要使用实际的页面项目(毕竟,这些是绑定变量)。
为了进一步澄清,您不会写:

return P_WEBSERVER;

但是你必须使用一个页面项目,比如说P3_WEBSERVER,如果它不存在,你当然需要创建一个:

:P3_WEBSERVER := p_webserver;

当然,您需要确保其中存在正确的值,因为您不能像在代码示例中那样短路(p_webserver即使平台不是,通常也会保存一个值'Apache')例如:

if (:P3_PLATFORM = 'Apache') then
   :P3_WEBSERVER := P_WEBSERVER;
else
   :P3_WEBSERVER := NULL;
end if;
于 2013-08-22T07:30:04.157 回答
2

只需阅读错误消息:

第 15 行,第 5 列

所以,这条线引起的麻烦:

return P_WEBSERVER;

returnPL/SQL 块中不允许,使用输出参数返回值。

阅读Tom的答案以了解如何做到这一点。

于 2013-08-23T06:30:29.113 回答