如何在 PLSQL Developer 中测试包含 DML 的 Oracle 函数?

Posted

技术标签:

【中文标题】如何在 PLSQL Developer 中测试包含 DML 的 Oracle 函数?【英文标题】:How to test an Oracle function that contains DML in PLSQL Developer? 【发布时间】:2009-12-12 22:39:36 【问题描述】:

选择不包含 DML 的 Oracle 存储函数的返回值,只需选择函数即可:

select function_name() from dual;

如果函数包含 DML(在这种情况下,一些插入记录传递给函数的参数),则不允许上述查询。 (ORA-14551)

如何选择/查看该函数的返回值?

如果我在 plsql developer 中选择“测试”,plsqldev 会产生类似:

declare
  -- Non-scalar parameters require additional processing 
  result xmltype;
begin
  -- Call the function
  result := find_person(as_surname => :as_surname,
                       as_given => :as_given,
                       ad_birth_date_from => :ad_birth_date_from,
                       ad_birth_date_to => :ad_birth_date_to,
                       as_gender => :as_gender);
end;

如何查看“结果”变量的值?

select result from dual;

在开始/结束块内产生

ORA-06550: PLS-00428: an INTO clause is expected in this SELECT statement

【问题讨论】:

【参考方案1】:

将“result”更改为“:result”,然后单击变量网格左上角的小箭头。 它应该添加“结果”作为绑定变量,您可以指定它的类型。

在您的情况下,最好的选择是 clob 或 PL/SQL 字符串。

您的脚本可能如下所示:

declare
  result xmltype;
begin
  result := find_person(as_surname => :as_surname,
                        as_given => :as_given,
                        ad_birth_date_from => :ad_birth_date_from,
                        ad_birth_date_to => :ad_birth_date_to,
                        as_gender => :as_gender);
  if result is null then
    :result := null;
  else
    :result := result.GetClobVal();
  end if;
end;

如您所见,它基本上是 PL/SQL Dev 为您创建的,除了处理如何以 PL/SQL Dev 理解的方式返回 xmltype。

如果要返回结果集,可以返回游标:

begin
  ...
  open :someCursor for 
    select 1 from ...;
  ...

您必须将变量网格中的“someCursor”类型更改为“cursor”,否则它将不起作用。

【讨论】:

【参考方案2】:

我没有使用过 xmltype,但文档提供了以下选项:

dbms_output.put_line(result.getStringVal());

【讨论】:

【参考方案3】:

添加

pragma autonomous_transaction 

declare 块中的函数允许从对偶中选择它

select find_person(arguments) from dual;

由于函数中的 DML 只是用于记录传递给函数的参数,因此使用自主事务是可以接受的,否则应避免

【讨论】:

真的,你应该有一个被调用的日志过程 使用autonomous_transaction 进行日志记录通常是个坏主意。您必须提交您的日志记录,然后如果主事务回滚,则无法始终看到用户实际做了什么。 不仅如此,让一个函数自治以便您可以从 SQL 调用它可能会产生灾难性的副作用【参考方案4】:

pragma_autonomous_transaction 是一种方式。

但要在不影响您的原始数据库的情况下进行测试,很少有开源工具可以测试您的 SQL / PLSQL,例如 DBUNIT、utPLSQL 等。

这些是 SQL 和 plsql 的单元测试工具

【讨论】:

【参考方案5】:

PLSQL developer 中的测试屏幕有两个部分。在上半部分,您将找到您在问题中显示的代码。测试函数生成的代码已将函数的变量替换为绑定变量::as_surname、:as_given 等。 在屏幕下方,您可以输入这些参数的值并查看结果值。

【讨论】:

【参考方案6】:

SQL Developer 与 DBMS_OUTPUT 配合得很好。它在脚本输出、结果等旁边有一个单独的选项卡。只需单击“启用输出”小按钮并在代码中使用 DBMS_Output.Put_Line(result);

【讨论】:

以上是关于如何在 PLSQL Developer 中测试包含 DML 的 Oracle 函数?的主要内容,如果未能解决你的问题,请参考以下文章

plsql developer 编辑存储过程 未响应

plsqldevloper测试脚本中怎么选中一行

plsql developer中如何设置sql window显示行号

pl sql developer应用问题

如何在 SQL Developer 中的 PLSQL 错误后抑制脚本显示(禁用命令/代码输出)

plsql developer如何导出数据库,不是导出表!