简体   繁体   中英

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

Can we pass partition as parameter in stored procedure ? I'm getting following error. Please help on this.

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;

Error:

Error at line 1 ORA-02149: Specified partition does not exist ORA-06512: at "schema1.PROCEDURE_NAME", line 17 ORA-06512: at line 1

I think you can do by Dynamic SQL Statements, EXECUTE IMMEDIATE Statement

follow this link ... 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;

Hope this will work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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