调用具有refcursor作为out参数的过程

时间:2014-12-07 16:43:07

标签: sql oracle toad

我按如下方式创建了一个包:

create or replace package apps.xx_sal
as
   PROCEDURE SAL_HIST_C(p_person_id IN NUMBER
                        ,p_success   OUT VARCHAR2
                        ,p_sql   OUT VARCHAR2
                        ,p_cur   OUT SYS_REFCURSOR)
IS
      l_success            VARCHAR2(32000) := 'OK';
      l_sql                VARCHAR2(32767);
      l_sql_empty          VARCHAR2(32767);
      l_step               VARCHAR2(1000);
      l_query_length       PLS_INTEGER := 0;
      c_process   CONSTANT VARCHAR2(200) := 'SAL_HIST_C';
   BEGIN
      l_step := c_process || ' :: BUILD EMPTY SQL';
      --

      l_sql_empty := ' SELECT person_id
  ,pay_basis_id
  ,change_date

       from apps.salary_hist_v
         WHERE 1 = 2 ';
      --

      --
      l_step := c_process || ' :: BUILD SQL';
      --
      l_sql      :=
         '
    SELECT paf.person_id
          ,paf.pay_basis_id
          ,ppp.change_date change_date

    FROM hr.per_pay_proposals ppp
        ,per_all_assignments_f paf

    WHERE paf.primary_flag = ''Y''

    AND   ppb.pay_basis_id = paf.pay_basis_id
    AND   paf.person_id = :l_person_id ';

      --
      -- check sql query
      l_query_length := LENGTH(l_sql);
      --DBMS_OUTPUT.put_line ('Length of EXECUTED SQL := ' || l_query_length);

      -- open cursor with bind variables applied
      --
      l_step := c_process || ' :: OPEN CURSOR with BIND VARIABLE APPLIED';

      --
      OPEN p_cur FOR l_sql USING p_person_id;

      l_success := 'OK';
      p_sql := l_sql;
      p_success := l_success;
   EXCEPTION
      WHEN OTHERS
      THEN
         l_success := 'ERROR :: ' || l_step || CHR(10) || SQLERRM || CHR(10) || DBMS_UTILITY.format_error_backtrace;
         p_sql := l_sql;
         p_success := l_success;

         OPEN p_cur FOR l_sql_empty;
   END SAL_HIST_C;

现在当我传递参数以查看输出时发生错误:

DECLARE 
 --l_person_id  number;

     l_success            VARCHAR2(32000) ;
      l_sql                VARCHAR2(32767);
  l_cur sys_refcursor;

BEGIN 

  APPS.xx_sal.SAL_HIST_C (   
   person_id=>4816, 
p_success => l_success, 
p_sql=>l_sql,
p_cur => :l_cur);

  COMMIT; 
  DBMS_OUTPUT.PUT_LINE ('Output Returned from Proc :: ' || l_success); 
DBMS_OUTPUT.PUT_LINE ('SQL Executed for the GRID :: ' || l_cur); 
END;

错误:

  

[错误]执行(10:3):ORA-06550:第10行,第3栏:
  PLS-00306:调用' SAL_HIST_C'中的参数数量或类型错误   ORA-06550:第10行,第3栏:
  PL / SQL:语句被忽略
  ORA-06550:第18行,第23栏:
  PLS-00306:调用' ||'
时参数的数量或类型错误   ORA-06550:第18行,第1栏:
  PL / SQL:忽略语句

我不知道为什么会发生错误。我在Toad执行。我想我没有正确地调用匿名块中的过程

2 个答案:

答案 0 :(得分:0)

@ user3809240

您的邮件中有两个ORA错误。

<强> 1。 PLS-00306:调用&#39; SAL_HIST_C&#39;

的参数数量或类型错误

替换

APPS.xx_sal.SAL_HIST_C (person_id=>4816, p_success => l_success, p_sql=>l_sql,p_cur => :l_cur);

APPS.xx_sal.SAL_HIST_C (4816,  l_success, l_sql,l_cur);

<强> 2。 PLS-00306:调用&#39; ||&#39;

的参数数量或类型错误

我们不能做refcursor的控制台输出。注释掉下面的行,然后重新运行你的来电程序。

DBMS_OUTPUT.PUT_LINE ('SQL Executed for the GRID :: ' || l_cur); 

现在,它应该可以完美运作。

干杯,

马杜。

PS:如果我的解决方案有效,请将此帖子标记为答案。 :)

答案 1 :(得分:0)

我看错了两件事:

  1. 您的存储过程有一个名为p_person_id的参数,但您使用名为person_id的参数调用它。

  2. 您无法连接字符串和引用游标。如果要显示引用光标所产生的值,则必须重复从光标中获取值,显示每一行,直到没有任何一行为止。

  3. 顺便说一下,我没有看到COMMIT的重点,因为您没有插入,更新或删除的数据。