2009-12-12 80 views
2

选择不包含DML的Oracle存储函数的返回值可以通过简单地选择函数来完成:如何在PLSQL Developer中测试包含DML的Oracle函数?

select function_name() from dual; 

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

如何选择/查看此功能的返回值?

如果我在plsql开发人员中选择“test”,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; 

如何查看“result”变量的值?开始/结束块内的

select result from dual; 

生成

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

回答

0

加入

pragma autonomous_transaction 

给函数在declare块允许它被从双

select find_person(arguments) from dual; 

选择自t他在函数中的DML只是用来记录传递给函数的参数,这是可以接受的使用autonomous_transaction,否则应该避免

+0

真的,你应该有一个被称为 – 2009-12-13 04:30:51

+0

的日志程序使用autonomous_transaction进行日志记录通常是一个坏主意。你必须提交日志,然后不能总是看到用户实际上做了什么,如果主事务回滚。 – jva 2009-12-14 10:53:00

+0

-1:这并不回答被问到的问题 – kurosch 2009-12-21 22:25:40

0

pragma_autonomous_transaction是一种方法。

但出影响您的原始数据库来测试,有一些开源工具来测试像DBUnit的,utPLSQL等

您的SQL/PLSQLs这些单元测试工具SQL和PLSQL

0

的PLSQL开发人员的测试屏幕有两个部分。在上面你会发现你在问题中显示的代码。测试函数生成的代码已将函数的变量替换为绑定变量::as_surname,:as_given等。 在屏幕的下半部分,可以输入这些参数的值并查看结果的值。

1

我还没有和XMLType的工作,但文档提供了以下选项:

dbms_output.put_line(result.getStringVal()); 
2

变“结果”为“:结果”,并在变量的左上角点击小箭头啄格。 它应该添加“结果”作为绑定varibale,您可以指定其类型。

在你的情况下,最好的选择是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开发已经为您创建,除了如何在一个方法返回的XMLType处理PL/SQL Dev可以理解。

,如果你想返回一个结果,你可以返回光标:

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

你必须在变量表格为“光标”改变“someCursor”的类型,或者没有去上班。

+0

+1:出色的响应 – kurosch 2009-12-21 22:27:23

0

SQL Developer与DBMS_OUTPUT工作得很好..它有一个单独的标签旁边的脚本输出,结果等只需点击“启用输出”按钮,并在您的代码中使用DBMS_Output.Put_Line(result);