Friday, August 27, 2010

Error Message : ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML

aduh...error mulu ya pakai PL/SQL..abis kebiasaan pakai T-SQl sih...
bikin function yang didalamnya ada proses DDL(Data Definition language) koq ga mau y?
aq pikir2..masak DB sekelas oracle koq gt aja ga support..
hmmm akhirnya ketemu juga jawabannya..
scriptnya harus di kasih tambahan script lg ternyata
ternyata ini 'pragma autonomous_transaction;' yang dicari2 dari td..
ihh gemez......bikin lama kerjaan aj:D

========================================================
CREATE OR REPLACE Function NextProcessInDestinationTable
( modeInput IN Integer, tableNm IN varchar2, tablespaceNm IN varchar2
, dd IN varchar2, mm IN varchar2, yy IN varchar2)
RETURN Integer
IS
-- penambahan ini untuk mengatasi error msg :
-- ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML

pragma autonomous_transaction; -- <===== ini dia :D

tailOfTable VARCHAR2(50);
sqlStatement VARCHAR2(2000);
i integer :=0;

BEGIN

IF ( tableNM = 'ACTIVITY' or tableNM = 'PENDING'
or tableNM = 'SETTLEMENT_LOP' or tableNm = 'RESOLVED') THEN

tailOfTable := substr(yy, 3, 2) || mm;
ELSIF ( tableNM = 'CUSTOMER' or tableNM = 'MERCHANT') then

tailOfTable := substr(yy, 3, 2) || mm ||dd;
END IF;

DBMS_OUTPUT.PUT_LINE('>>>>> ' || tailOfTable);

if (modeinput = 0) then

select count(1) into i
from all_tables
where table_name = (tableNm || tailOfTable) and tablespace_name = tablespaceNm;

if ( i > 0 ) then
-- processinsertdata please wait y:D
return 1;
else
--create table if not exists
sqlStatement := 'create table ' || tableNm || tailOfTable || ' as select * from ' || ' template_' || TableNm;

Execute immediate (sqlStatement);

end if;





end if;



return 0;

END;

========================================================

No comments: