如何在 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中如何设置sql window显示行号