Oracle中的动态存储过程

时间:2016-06-29 21:58:28

标签: stored-procedures oracle11g

大师,我有一个存储过程必须在动态表上执行。以下是存储过程的外观。

create or replace PROCEDURE EFX_RECON_UPDATE_SPROC(
    FILENAME IN VARCHAR2 ,
    SOURCE   IN VARCHAR2 )
AS
  TABLE_NAME VARCHAR2(200);
  query_str  VARCHAR2(500);
  cnt        NUMBER(10);
BEGIN
  -- Create dynamic table for each fullfilment system.
    TABLE_NAME := SOURCE||'_BRM_OMC_RECON_T';
    query_str  :='SELECT count(*) from ' || SOURCE || '_BRM_OMC_RECON_T  where PROCESSINGFILENAME='''||FILENAME||''';';
    EXECUTE IMMEDIATE query_str;


    query_str:='MERGE INTO '||TABLE_NAME||' T
                USING (    
                SELECT    
                ERRORCODE, PROCESSINGFILENAME,    
                RECORDNUMBER from ERROR_UPLOAD_T 
                ) TMP    
                ON (T.RECORDNUMBER = TMP.RECORDNUMBER and    
                T.PROCESSINGFILENAME= TMP.PROCESSINGFILENAME and    
                T.PROCESSINGFILENAME='''||FILENAME||''')    
                WHEN MATCHED THEN    
                UPDATE SET        
                T.STATUS = ''ERROR'',        
                T.ERRORSOURCE = ''BRM'',        
                T.ERRORCODE = TMP.ERRORCODE';
                EXECUTE IMMEDIATE query_str;
COMMIT;
END EFX_RECON_UPDATE_SPROC;

执行存储过程时出现此错误。问题出在FILENAME上,我已将其附在' QUOT。

  

ORA-00933:SQL命令未正确结束
  ORA-06512:at" PIN149.EFX_RECON_UPDATE_SPROC",第12行

1 个答案:

答案 0 :(得分:1)

根据错误消息,问题出现在这一行:

EXECUTE IMMEDIATE query_str;

应该是:

EXECUTE IMMEDIATE query_str INTO cnt;

分号应从SELECT字符串中删除。

虽然变量cnt没有在其他地方使用,所以我不确定该声明应该完成什么。