【问题标题】:Dynamic Stored Procedure in OracleOracle中的动态存储过程
【发布时间】:2016-06-29 21:58:28
【问题描述】:

大师,我有存储过程必须在动态表上执行。这是存储过程的样子。

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 上,我已将其括在“引号”中。

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

【问题讨论】:

  • 在执行之前打印出 SQL 语句。对我来说,语法错误不是很明显,但是一旦你打印出你构建的 SQL 语句,它可能就会出现。

标签: stored-procedures oracle11g


【解决方案1】:

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

EXECUTE IMMEDIATE query_str;

应该是:

EXECUTE IMMEDIATE query_str INTO cnt;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多