繁体   English   中英

我们可以在存储过程中将分区作为参数传递吗? 我收到以下错误

[英]Can we pass partition as parameter in stored procedure ? I'm getting following error

我们可以在存储过程中将分区作为参数传递吗? 我遇到以下错误。 请帮忙。

CREATE OR REPLACE PROCEDURE PROCEDURE_NAME (PARTITION_NAME IN VARCHAR2)  
     IS  
    LASTDATE VARCHAR2(12);  
ENDDATE VARCHAR2(12);  
BEGIN  
IF PARTITION_NAME='DEC_2014' OR PARTITION_NAME='JAN_2015' OR   PARTITION_NAME='MAR_2015' OR PARTITION_NAME='MAY_2015' OR   PARTITION_NAME='JUL_2015' OR PARTITION_NAME='AUG_2015' OR   PARTITION_NAME='OCT_2015' OR PARTITION_NAME='DEC_2015' OR   PARTITION_NAME='JAN_2016' THEN
ENDDATE:='31';
ELSIF PARTITION_NAME='NOV_2014' OR PARTITION_NAME='APR_2015' OR PARTITION_NAME='JUN_2015' OR PARTITION_NAME='SEP_2015' OR PARTITION_NAME='NOV_2015' THEN  
ENDDATE:='30';  
ELSE  
ENDDATE:='28';  
END IF;  
LASTDATE:=CONCAT(CONCAT(ENDDATE,'-'),REPLACE (PARTITION_NAME, '_', '-'));  
DBMS_OUTPUT.PUT_LINE(LASTDATE);  
DBMS_OUTPUT.PUT_LINE(PARTITION_NAME);  

UPDATE  
  /*+ PARALLEL(Alias 4) */  
  TABLE_NAME PARTITION (PARTITION_NAME) Alias  
SET Alias.Alias_D_EFFECTIVE_DATE =  
  (SELECT  
    /*+ PARALLEL(Alias3 4) */  
    ALAIS2.ALAIS2_D_DATETIME  
  FROM schema1.TABLE_2 ALAIS2  
  WHERE TRUNC(ALAIS2_D_DATETIME) <= TO_DATE(LASTDATE,'DD-MON-YYYY')  
  AND ALAIS2.ALAIS2_N_TRN_ID                     = Alias.Alias_N_PR  
  )  
WHERE EXISTS  
  (SELECT Alias3.ALAIS2_D_DATETIME  
  FROM schema1.TABLE_2 Alias3  
  WHERE TRUNC(Alias3.ALAIS2_D_DATETIME) <= TO_DATE(LASTDATE,'DD-MON-YYYY')  
  AND Alias3.ALAIS2_N_TRN_ID                         = Alias.Alias_N_PR  
  );  

COMMIT;  
END PROCEDURE_NAME;

错误:

第1行发生错误ORA-02149:指定的分区不存在ORA-06512:在“ schema1.PROCEDURE_NAME”的第17行ORA-06512:在第1行

我认为您可以通过动态SQL语句,EXECUTE IMMEDIATE语句来完成

跟随此链接... https://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg09dyn.htm https://docs.oracle.com/cloud/latest/db112/LNPLS/dynamic.htm #LNPLS01115

CREATE OR REPLACE PROCEDURE PROCEDURE_NAME (PARTITION_NAME IN VARCHAR2)  
     IS  
    LASTDATE VARCHAR2(12);  
ENDDATE VARCHAR2(12); 
query_str VARCHAR2(1000); 
BEGIN  
//.......your code.......
query_str := 'UPDATE TABLE_NAME PARTITION (' || PARTITION_NAME || ') Alias ' 
            ||'SET Alias.Alias_D_EFFECTIVE_DATE =.....'  

EXECUTE IMMEDIATE query_str;
COMMIT;  
END PROCEDURE_NAME;

希望这会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM