【问题标题】:ORA-06550: line 1, column 7 (PL/SQL: Statement ignored) ErrorORA-06550:第 1 行,第 7 列(PL/SQL:忽略语句)错误
【发布时间】:2013-11-14 13:46:15
【问题描述】:

我收到存储过程的以下错误并且无法理解问题(必须来自数据库端)在谷歌搜索时,我发现了类似的问题但无法获得解决方案。谁能帮我找出PROCEDURE中的错误??

错误:-

18:58:50,281 ERROR [STDERR] java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'SP_DIST_RETAILER_REMAP'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

存储产品(SP_DIST_RETAILER_REMAP):-

CREATE OR REPLACE PROCEDURE SMAPRD02.SP_DIST_RETAILER_REMAP (    
      i_old_dist_code IN VARCHAR2,
      i_new_dist_code IN VARCHAR2,      
      i_territory_remapping IN NUMBER,
      i_remapping_reason IN VARCHAR2,
      i_trans_doneby_rolename IN VARCHAR2,
      i_trans_doneby_id IN NUMBER,     
      i_trans_dist_rolename IN VARCHAR2, 
      i_trans_ret_rolename IN VARCHAR2,     
      i_activity_type IN VARCHAR2,
      i_ret_list IN V_ARRAY, 
      result OUT VARCHAR2,
      i_o_query OUT VARCHAR2      
)
AS

--i_ret_codes OUT VARCHAR2;

v_dist_count NUMBER;
v_ret_count NUMBER;
v_ret_codes VARCHAR2(10000)  := '';
v_flag VARCHAR2(10) := 'true';
v_trans_id NUMBER;
v_query VARCHAR2(10000);

BEGIN

IF i_territory_remapping = 1 then

SELECT count(*) into v_dist_count FROM tblemployee where EMPCODE = i_new_dist_code and circle_code = (select emp.circle_code
        from tblemployee emp where emp.empcode = i_old_dist_code) and upper(user_type) like upper('%dist%') and upper(ACCESS_TO) in ('SALES','BOTH') and upper(stage) not in (upper('InActive'));

ELSE

SELECT count(*) into v_dist_count FROM tblemployee where EMPCODE = i_new_dist_code and circle_code = (select emp.circle_code from tblemployee emp
   where emp.empcode = i_old_dist_code) and cluster_code = (select emp.cluster_code from tblemployee emp where emp.empcode = i_old_dist_code)
   and upper(user_type) like upper('%dist%') and upper(ACCESS_TO) in ('SALES','BOTH') and upper(stage) not in (upper('InActive'));

END IF; 

IF v_dist_count =0 THEN

result := 'invalid_new_dist_code';

v_flag := 'false';

ELSIF v_dist_count = 1 THEN

SELECT count(*) into v_ret_count FROM tblretailer t where t.DIST_CODE = i_old_dist_code and (upper(t.ACCESS_TO) = 'SALES' or upper(t.ACCESS_TO) = 'BOTH');

--SELECT count(*) into v_ret_count FROM tblretailer t where t.DIST_CODE = i_old_dist_code and upper(t.ACCESS_TO) = 'SALES' and upper(t.stage) in ('APPROVED','INACTIVE');

IF v_ret_count=i_ret_list.count THEN 

   IF i_territory_remapping = 1 THEN

   result := 'no_ret_left';

   v_flag := 'false';

   END IF;

ELSE
    IF i_territory_remapping != 1 THEN

    result := 'ret_left';

    v_flag := 'false';

    END IF;

END IF;


END IF;

IF i_ret_list is null or i_ret_list.count = 0 THEN

    result := 'empty retailers list';

    v_flag := 'false';

END IF;

/*FOR i IN i_ret_list.FIRST .. i_ret_list.LAST
      LOOP


          IF v_ret_codes is null
           THEN          
            v_ret_codes := ''''||i_ret_list(i)||''''; 
          ELSE 

            v_ret_codes  := v_ret_codes||','''||i_ret_list(i)||''''; 

          END IF;        


           IF v_ret_codes is null
           THEN          
            v_ret_codes := i_ret_list(i); 
          ELSE 

            v_ret_codes  := v_ret_codes||','||i_ret_list(i); 

          END IF;     

      END LOOP;

i_ret_codes := v_ret_codes;

v_flag := 'false';
result := 'success';*/

IF v_flag = 'true' THEN

FOR i IN i_ret_list.FIRST .. i_ret_list.LAST
      LOOP


         IF v_ret_codes is null
           THEN          
            v_ret_codes := ''''||i_ret_list(i)||''''; 
          ELSE 

            v_ret_codes  := v_ret_codes||','''||i_ret_list(i)||''''; 

          END IF;               

      END LOOP;

--i_ret_codes := v_ret_codes;


--update tblretailer set dist_code=i_new_dist_code,DIST_ID=to_number(i_new_dist_code),cluster_code=(select cluster_code from tblemployee where empcode = i_new_dist_code),FOSID='',FOS_CODE='',DSR_ID='',DSR_CODE='',LAST_UPDATED_DATE=sysdate where retcode in (v_ret_codes);

v_query := 'update tblretailer set dist_code='||i_new_dist_code||',DIST_ID=to_number('||i_new_dist_code||'),cluster_code=(select cluster_code from tblemployee where empcode = '||i_new_dist_code||'),FOSID='''',FOS_CODE='''',DSR_ID='''',DSR_CODE='''',LAST_UPDATED_DATE=sysdate where retcode in ('||v_ret_codes||')';

execute immediate (v_query);

--i_query :='update tblretailer set dist_code='||i_new_dist_code||',DIST_ID=to_number('||i_new_dist_code||'),cluster_code=(select cluster_code from tblemployee where empcode = '||i_new_dist_code||'),FOSID='',FOS_CODE='',DSR_ID='',DSR_CODE='',LAST_UPDATED_DATE=sysdate where retcode in ('||v_ret_codes||');';

insert into TBL_TRANSFER_SUP_MASTER(MASTER_ID,TRANS_ID,TRANS_DONEBY_ROLENAME,TRANS_DONEBY_ID,TRANS_FROM_ROLENAME,TRANS_FROM,TRANS_TO_ROLENAME,TRANS_TO,ACTIVITY_CODE,TRANS_DATE,TRANSFER_REASON,LAST_UPDATED_DATE)
                 values(SUP_MASTER_TRANS_ID_SEQ.nextval,SUP_MASTER_TRANS_ID_SEQ.nextval,i_trans_doneby_rolename,i_trans_doneby_id,i_trans_dist_rolename,i_old_dist_code,i_trans_dist_rolename,i_new_dist_code,'101',sysdate,i_remapping_reason,sysdate) return TRANS_ID into v_trans_id;


FOR i IN i_ret_list.FIRST .. i_ret_list.LAST
      LOOP

      insert into TBL_TRANSFER_SUP_DTLS(DTLS_ID,TRANS_ID,TRANS_ON_ROLENAME,TRANS_ON_ID,LAST_UPDATED_DATE)
             values(SUP_DTLS_ID_SEQ.nextval,v_trans_id,i_trans_ret_rolename,i_ret_list(i),sysdate);


      END LOOP;

IF SQL%ROWCOUNT>0 THEN

result := 'success';

ELSE

result := 'failure';

END IF;

--update tblstock set NEW_DIST_CODE_REMAP=i_new_dist_code,REMAP_DATE=sysdate,LAST_UPDATED_DATE=sysdate where (DIST_CODE=i_old_dist_code or NEW_DIST_CODE_REMAP=i_old_dist_code) and RET_CODE in (v_ret_codes);      

v_query := 'update tblstock set NEW_DIST_CODE_REMAP='||i_new_dist_code||',REMAP_DATE=sysdate,LAST_UPDATED_DATE=sysdate where (DIST_CODE='||i_old_dist_code||' or NEW_DIST_CODE_REMAP='||i_old_dist_code||') and RET_CODE in ('||v_ret_codes||')';     

execute immediate (v_query);

i_o_query := v_query;

insert all into TBL_ACTIVITY_LOG (LOG_ID,TRANS_ID,ACTIVITY_DONEBY_ROLENAME,ACTIVITY_DONEBY_ID,ACTIVITY_REFERENCE_ID,ACTIVITY_CODE,ACTIVITY_DATE)
                values(ACTIVITY_LOG_TRANS_ID_SEQ.NEXTVAL,ACTIVITY_LOG_TRANS_ID_SEQ.NEXTVAL,i_trans_doneby_rolename,i_trans_doneby_id,v_trans_id,
                act_code,sysdate) select log_config.ACTIVITY_CODE act_code from TBL_ACTIVITY_LOG_CONFIG log_config  
               where upper(log_config.ACTIVITY_TYPE)= upper(i_activity_type);

END IF;

END;
/

Java 代码:-

try{            
            if(ret_list.size()>0)
                ret_code = ret_list.toArray();
             con = ConnectionManager.getDirectConnection();
             ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(PropertyLoader.RET_SECONDARY_V_ARRAY,con);
             ARRAY array_to_pass = new ARRAY( descriptor,con, ret_code );
             cstmt = con.prepareCall("{ call SP_DIST_RETAILER_REMAP(?,?,?,?,?,?,?,?,?,?,?,?)}");
             cstmt.setString(1,old_dist_code.trim());
             cstmt.setString(2,new_dist_code.trim());
             if(territory_remapping)            
             cstmt.setInt(3,1);
             else
             cstmt.setInt(3,2);          
             cstmt.setString(4,remapping_reason);
             cstmt.setString(5,userVO.getRolename().trim());
             cstmt.setInt(6,userVO.getEmpid());
             cstmt.setString(7,PropertyLoader.DISTRIBUOTR_ROLENAME);
             cstmt.setString(8,PropertyLoader.RETAILER_ROLENAME);
             cstmt.setString(9,PropertyLoader.ACTIVITY_TYPES_RETAILER_REMAPPING);
             cstmt.setArray(10,array_to_pass);
             cstmt.registerOutParameter(11,Types.VARCHAR);
             cstmt.registerOutParameter(12,Types.VARCHAR);
             /*cstmt.registerOutParameter(13,Types.VARCHAR);*/
             cstmt.execute();
             status = cstmt.getString(11);
             System.out.println("Remap Update Query  "+cstmt.getString(12));
             //System.out.println(cstmt.getString(13));

        }

【问题讨论】:

  • 错误文本似乎表明您在调用 SP 时使用的参数数量或类型不正确。这可能与您如何将输入/输出参数绑定到调用 java 端有关。你能展示一下你是如何使用它的吗?
  • @XaviLópez Java 代码添加到问题先生。
  • RET_SECONDARY_V_ARRAY 是否解析为相同的V_ARRAY 程序正在使用?它们必须是相同的 SQL 级别类型声明;我相信不同的类型(即使它们声明相同)会抛出这个错误。
  • 我对代码中使用的 ARRAY 对象有疑问。 Collection.ToArray[] 返回 Object[] 并依赖于泛型。我不确定这个数组数据类型和 V_ARRAY 数据类型是否相互匹配。能否分享一下 V_ARRAY 的定义并展示 ret_code 的数据类型。
  • @Rajan - 具有相同声明的不同类型是不够的,它们必须是完全相同的类型。你能在运行时添加V_ARRAY 的类型声明和PropertyLoader.RET_SECONDARY_V_ARRAY 的值吗?它肯定不是空的吗?基本上RET_SECONDARY_V_ARRAY 必须设置为"V_ARRAY"。只是想确定是否是这种情况,这可能不是您的问题,但对我来说似乎很可疑。

标签: sql database oracle stored-procedures procedure


【解决方案1】:

如果PropertyLoader.RET_SECONDARY_V_ARRAY中存储的值不是"V_ARRAY",那么你使用的是不同的类型;即使它们声明相同(例如,两者都是table of number),这也不起作用。

你在打this data type compatibility restriction

您可以将集合分配给集合变量,前提是它们具有 相同的数据类型。拥有相同的元素类型是不够的。

您正在尝试使用与预期类型不同的参数调用该过程,这就是错误消息告诉您的内容。

【讨论】:

  • 我有两个具有相同表结构的数据库,我尝试使用另一个数据库并且它工作正常,但是在连接到这个数据库时我收到了这个错误。有什么线索吗?? ——
  • 线索是您似乎在使用不同的表类型。请显示类型声明(在两个数据库上)和参数值。否则只是猜测。
  • 先生,我发现了问题的问题,从 toad 执行查询时,我不明白在 HIGHLIGHTED 区域中输入什么作为数组。过程名称与上面在问题中发布的名称相同。 i.imgur.com/L2uug2a.gif 请参考以下网址中的图片。
  • @Rajan - 您正在尝试从 Toad 调用该过程?您需要声明一个V_ARRAY 对象并在proc 调用中填充并传递它(或传递null)。你还没说那个类型是怎么定义的。
  • 先生,我不是专业的 DBA。我是一名 java 开发人员,所以没有得到你想说的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多