我们可以在存储过程中将分区作为参数传递吗?我收到了以下错误。 请帮忙。
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行
答案 0 :(得分: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;
希望这会奏效。