2011-02-28 3 views
1

프로그래밍에 익숙하지 않으므로 도움이 될 것입니다.저장 프로 시저 DBA 작업 프로그래밍

내 저장된 proc 코드를 찾아서 테이블을 삭제하고 DBA 작업을 작성하여 매시간 실행합니다.

CREATE OR REPLACE procedure DELETE_My_TABLE(myschema varchar2) as 
BEGIN 
    BEGIN 
     execute immediate 'delete from '||myschema||'.mytable where clause;'; 
    END; 
     BEGIN 
      DBMS_SCHEDULER.create_program (
      program_name  => 'DELETE_My_TABLE', 
      program_type  => 'STORED_PROCEDURE', 
      program_action  => 'execute DELETE_My_TABLE(myschema)', 
      number_of_arguments => 1, 
      enabled    => FALSE, 
      comments   => 'Program to delete table using a stored procedure.'); 
     DBMS_SCHEDULER.define_program_argument (
     program_name  => 'DELETE_My_TABLE', 
     argument_name  => 'myschema', 
     argument_position => 1, 
     argument_type  => 'VARCHAR2', 
     default_value  => 'myschema'); 

     DBMS_SCHEDULER.enable (name => 'DELETE_My_TABLE'); 
    END; 

    BEGIN 
     DBMS_SCHEDULER.create_schedule (
     schedule_name => 'DELETE_My_TABLE', 
     start_date  => SYSTIMESTAMP, 
     repeat_interval => 'freq=hourly; byminute=0', 
     end_date  => NULL, 
     comments  => 'Hourly Job to purge SEARCH_TEMP_TABLE'); 
    END; 
END; 
/

문제 :

ERROR at line 1: 
ORA-00920: invalid relational operator 
ORA-06512: at "MYSCHEMA.DELETE_My_TABLE", line 4 
ORA-06512: at line 1 

는 논리 (및 구문)을 사용할 수 있습니까? 내가 볼 수

+0

중첩 된 BEGIN ... END 블록을 달성하기 위해 무엇을하려고합니까? – cagcowboy

+1

이것은 올바르게 보이지 않습니다. 프로 시저에서는 먼저 테이블에서 삭제하지만 (벌금) 동일한 프로 시저를 다시 호출 할 시간별 스케줄이 작성됩니다. 스케줄러가이를 호출 할 때 동일한 작업을 반복하여 동일한 시간에 다른 프로 시저를 다시 호출합니다. 며칠 후에 당신은 수십 개의 일정 잡을 할거야, 내 생각 엔 ... –

답변

2

한 가지 문제는 당신이 EXECUTE IMMEDIATE 문자열에서 세미콜론을 필요가있다 : 나는 그것처럼이 보이는 즉각적인 문제를 해결하지 않습니다 의심

execute immediate 'delete from '||myschema||'.mytable where clause'; 
                   ^^ 
                 Removed from here 

생각을 당신의 BEGIN ... END 블록.

2

Oracle 스케줄러의 경우 일반적으로 한 번 프로그램을 작성합니다. 다음으로 프로그램을 조치로 취하는 작업을 작성합니다. 코드에서 지정한대로 작업을 지정할 수 있지만 선택해야합니다. 스케줄을 작성하여 작업에서 사용하게하거나 작업을 반복 간격으로 지정하십시오.

나는 매우 도움이 될만한 책 (Mastering Oracle Scheduler)에 대해 알고 있습니다.

+0

이 절차를 실행하는 것은 1 번 설정이다. – Sri

+1

Sri, 코드에 몇 가지 문제가 있습니다. 이것이 당신이하는 일이 아니라는 사실을 감안할 때, 더 작은 단계로 작업하십시오. 먼저 삭제를 수행하는 부분이 작동하면 스케줄러 코드로 이동합니다. 또한 인수를 원할 곳과 사용 방법을 결정하십시오. Create_program 부분의 경우 program_action은 프로 시저 이름이고 인수는없고 실행은 없습니다. 또한 정의한 일정에 따라 정의한 프로그램을 실행해야하는 작업을 만드는 것을 잊었습니다. 로널드. –

+0

나는 @ik_zelf에 동의해야하며, 거꾸로 한 걸음 나아가는 것이 좋습니다. 코드를 작성하기 전에 요구 사항을 정확하게 정의하십시오. 달성하고자하는 것은 무엇입니까? 테이블의 내용을 삭제하는 작업 만 필요한 경우 execute immediate 부분은 전혀 필요하지 않으며 불필요하게 작업을 복잡하게 만듭니다. –