调试表类型为输入参数的函数

时间:2014-08-30 18:45:43

标签: oracle11g plsqldeveloper

任何人都可以告诉我如何使用表类型作为输入参数调试函数,并且此函数返回一个流水线的表类型。

请参阅下面的详细信息。当我尝试测试它在匿名块下创建的功能时,但是当我点击调试按钮时它会出错:

匿名阻止:

declare
  -- Non-scalar parameters require additional processing 
  result t_bmk_q;
  pit_srch_str t_parm;
begin
  -- Call the function
  result := f_bmk_srch(pit_srch_str => pit_srch_str,
                               piv_op => 'ALL');
end;


---f_bmk_q  function returns table type t_bmk_q   pipelined


defintions:
==============
t_bmk_q  --->table type

t_bmk_q is TABLE OF r_bmk_q -->object of some attributes.


pit_srch_str ---> is parameter of type  t_parm which is table type  of r_parm


--plz see def of r_parm:

CREATE OR REPLACE TYPE r_parm AS OBJECT
    (
        p_abc                 varchar2(200)
                ,p_new_val               varchar2(2000)
                ,CONSTRUCTOR FUNCTION r_parm
                  (
                   p_abc                 varchar2
                   ,p_new_val                varchar2
                  ) RETURN SELF AS RESULT
        );

Example:I have below sample values to test and debug:
r_parm('TAB1.VALUE','123321123')

由于 拉杰什

1 个答案:

答案 0 :(得分:2)

您似乎正在使用PL / SQL Developer测试窗口来运行测试。我认出了评论Non-scalar parameters require additional processing

PL / SQL Developer的测试窗口不能很好地处理流水线功能。 您最好删除result变量并将函数调用包装在open :cursor for select * from table(...)中。将名为cursor的Cursor类型的变量添加到窗口下方的变量列表中。

要填充输入表,您只需“调用”表类型,将表中的每一行作为单独的参数传递。例如,

t_parm(r_parm(...), r_parm(...), r_parm(...))

您可以按照自己喜欢的方式向表中添加任意数量的行。

将这两个变化放在一起,我们有以下内容:

declare
  pit_srch_str t_parm;
begin
  -- Create input table.    
  pit_srch_str := t_parm(
            r_parm('TAB1.VALUE','123321123'),
            r_parm('TAB2.VALUE','456597646')
  );

  -- Call the function
  open :cursor for select * from table(f_bmk_srch(pit_srch_str => pit_srch_str,
                               piv_op => 'ALL'));
end;
/

运行该功能后,您可以从cursor变量中获取结果(使用最右侧的...按钮。)