Announcement

Collapse
No announcement yet.

Oracle APEX Scheduler

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Oracle APEX Scheduler

    Hallo Entwicklerteam,

    ich habe ziemliche Schwierigkeiten einfache Beispiele zu einem Scheduler etwas im Internet zu finden. Ich möchte im Allgemeinen einen Prozess entwickeln, welcher täglich einmal abläuft und einen Wert in der Datenbank überprüft (bspw. IF 0 THEN...). Wenn ein bestimmter Wert gegeben ist sollte dem Benutzer eine Email gesendet werden.

    Das mit Email werde ich sicherlich hinkriegen aber mit zeitgesteuerten Prozessen weiss ich nicht wie ich anfangen soll.

    Beispielsweise habe ich mich auf dieser Seite umgeschaut:

    http://www.oracle-base.com/articles/...yntax_examples

    Und zwar verstehe ich nicht so ganz wie man bspw. diesen Code umsetzt:

    Code:
    -- Display the schedule details.
    SELECT owner, schedule_name FROM dba_scheduler_schedules;
    Der sagt, dass die View oder Tabelle nicht existiert, obwohl ich den folgenden Code vorher ausgeführt habe:

    Code:
    -- Create the schedule.
    BEGIN
      DBMS_SCHEDULER.create_schedule (
        schedule_name   => 'test_hourly_schedule',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'freq=hourly; byminute=0',
        end_date        => NULL,
        comments        => 'Repeats hourly, on the hour, for ever.');
    END;
    Habe bereits so viele Tage investiert, dieses Problem zu lösen, jedoch kam ich auf keinen Ansatz. Könntet Ihr mir einen Beispielcode zeigen und beschreiben, wie man es genau in APEX implementiert.

    Ich bedanke mich im vorraus und wünsche Euch noch einen schönen Tag.

    Gruss

    e-styles

  • #2
    Das eine hat mit dem anderen nichts zu tun.
    Du erzeugst im unteren Teil ein Schedule, den du mit dem Select oben nicht abfragen kannst, weil Du kein Select Recht auf den View "dba_scheduler_schedules" hast.

    Du musst entweder den Admin bitten, das für den angemeldeten User freizugeben oder Dich selbst.

    Und1:
    Ich hab Apex bisher nur in Betrieb gesehen, die Schedulertechnik, die Du da nutzen möchtest hat damit aber nichts zu tun. Sie steht generell in Oracle zur Verfügung. Bei Deinen Versuch musst Du darauf achten, dass Du auch auf den entsprechenden APEX Daten arbeitest. (Aber vielleicht passt das auch alles von allein, wenn Du aus APEX raus arbeitest)
    Und2:
    Der reine Schedule nützt Dir nichts, das ist nur ein Termin. Du musst auch definieren, was geschehen soll
    Gruß, defo

    Comment


    • #3
      Danke für die Antwort,

      was meinst du mit:
      auf den entsprechenden APEX Daten arbeitest
      (Aber vielleicht passt das auch alles von allein, wenn Du aus APEX raus arbeitest)
      Das ist leider das Problem, wie soll ich das dann in APEX umsetzten? Bitte dringend um weitere Hilfe, da ich dieses Programm bis zum 21. Januar fertig haben muss. Es ist schon fast fertig, es fehlt nur noch ein Zeitgesteuerter Prozess.

      Danke !

      Comment


      • #4
        Zunächst nochmal: Ich kenne APEX nur als ein paar Webseiten, die ich mal gesehen hab und etwas von dem Konzept. Daher kann ich Dir keine Lösung nennen.

        Was benutzt Du genau als Entwicklungsumgebung?
        (Der Scheduler Call den Du gezeigt hast, ist ein ganz normaler Oracle Befehl, sieht nicht unbedingt nach APEX aus)
        Welche Oracle User nutzt Du?
        Hast Du Administrator bzw. DBA Zugriff in einem der Schemata?
        Ist dir das Oracle Rechte und Schema(!)konzept klar?
        Vermutlich nicht, denn Du hast zu meinem Hinweis der Abfrage von dba_scheduler_schedules nichts weiter geschrieben.

        Was immer Du auch Du als Schedule anlegst, kannst Du die Daten abfragen, die Du brauchst? Wenn ja, poste ein echtes Statement exemplarisch. Und schreibe bitte dazu, mit welchem Tool Du das absetzt. Gelingt es auch mit SQLPlus?

        Worauf ich hinaus will:
        Du musst wissen, in welchem User- und Rechtekontext Du arbeitest.
        Dies gilt nicht nur für die Produktivdaten, die Du verarbeiten möchtest, sondern auch für die Oracle "Werkzeuge", die du einsetzt.

        Beispiel "dba_scheduler_schedules"
        Du hast schlicht keine Zugriffsrechte. Ersetze "dba" durch "all" oder "user", das sind Varianten für einfache Endbenutzer.
        Egal, ob Du den Scheduler Code ausführen konntest (darauf hast Du also Rechte), er ändert nichts an dem Select Recht auf die View, die Du abfragen willst.

        Also versuch mal, 1 oder 2 Tage reichen sicher, um eine Schedulerautomatik zu bauen.
        Gruß, defo

        Comment


        • #5
          Danke, der Tipp mit "all" hat geholfen.

          Was benutzt Du genau als Entwicklungsumgebung?
          APEX ist ja der Name der Entwicklungsumgebung.

          Jedoch benutze ich jetzt eine andere Methode, um einen Scheduler zu erstellen. Dieser soll einfach jede Sekunde einen Text ausgeben. Dieser Code sieht wie folgt aus um den Scheduler zu erstellen.

          Code:
          BEGIN
          	DBMS_SCHEDULER.CREATE_JOB (
          		 job_name => 'SAY_HELLO7'
          		,job_type => 'PLSQL_BLOCK'
          		,job_action => 'BEGIN dbms_output.put_line(''Hello1'');dbms_output.put_line(''Hello2'');END;'
          		,start_date => SYSDATE
          		,repeat_interval => 'FREQ=SECONDLY;'
          		,enabled => TRUE
          		,comments => 'Jede Sekunde wir was ausgegeben.'
                  );
          END;
          Jedoch wird der Text sofort ausgegeben und nicht jede Sekunde.

          Damit rufe ich den Job auf:

          Code:
          DECLARE
            number PLS_INTEGER;
          
          BEGIN
            number := 0; 
            
            WHILE number < 10 LOOP
          
            DBMS_SCHEDULER.run_job (job_name => 'SAY_HELLO7');
            number := number + 1;
            END LOOP;
          
          END;
          Zuletzt editiert von e-styles; 15.01.2012, 23:24.

          Comment


          • #6
            Vermutlich funktioniert Dein Verfahren, nur die Prüfmethode ist fehlerhaft.

            Der Scheduler erzeugt autarke Prozesse, dbms_output liefert dann eine Ausgabe, die Du nicht sehen kannst. Ersetze es zu Testzwecken durch ein Update auf eine Testtabellenzeile, z.b. Datespalte update mit sysdate.

            Einen Job in einer Schleife laufen zu lassen ist auch keine gute Idee, dafür ist ja das Interval (apropos, wo ist der Unterschied zwischen 1 Sekunde und "sofort").

            Die Admin Views zum Scheduler liefern im übrigen auch Angaben zu letzte/nächste Laufzeit, Erfolg/ Misserfolg usw.
            Gruß, defo

            Comment


            • #7
              Hallo,

              also in einem Job, der ja als Systemprozess (ohne Clientverbindung) auf dem Server läuft, etwas ausgeben zu wollen ist nicht unbedingt sehr sinnreich. Wo erwartest du die Ausgabe? Auf der Konsole des Servers? Oder wird die Ausgabe von DBMS_OUTPUT irgendwohin umgeleitet?
              Mit DBMS_SCHEDULER.run_job führst du den Job sofort mit deiner aktiven Clientverbindung aus und bekommst deshalb auch sofort die Ausgabe.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                @defo

                Ich habe jetzt probiert, den Scheduler so zu erstellen, dass er jede Sekunde einen Datensatz in die Tabelle "Test" einfügen soll. Dieser Sieht nun so aus:

                Code:
                BEGIN
                	DBMS_SCHEDULER.CREATE_JOB (
                		 job_name => 'SAY_HELLO10'
                		,job_type => 'PLSQL_BLOCK'
                		,job_action => 
                'BEGIN
                  UPDATE TEST SET Datum = SYSDATE WHERE id = 40;
                END;'
                		,start_date => SYSDATE
                		,repeat_interval => 'FREQ=SECONDLY;'
                		,enabled => TRUE
                		,comments => 'Jede Sekunde wird ein Wert in die Tabelle Test geschrieben.'
                        );
                END;
                Dies hat soweit geklappt.

                Ich habe nun wieder die Schleife entfernt, da wo ich das Programm aufgerufen habe, dies sieht nun so aus:

                Code:
                BEGIN
                  DBMS_SCHEDULER.run_job (job_name => 'SAY_HELLO10');
                END;
                Es hat zumindest geklappt, er fügt bei dem Datensatz wo die ID = 40 ist das Datum hinzu, doch wie kann ich sichergehen, dass wirklich jede Sekunde der Job ausgeführt wird?

                Die Admin Views zum Scheduler liefern im übrigen auch Angaben zu letzte/nächste Laufzeit, Erfolg/ Misserfolg usw.
                Wo und wie könnte ich das nachsehen?

                apropos, wo ist der Unterschied zwischen 1 Sekunde und "sofort"
                Ich meine damit, dass bspw. die Schleife 10 mal durchlaufen soll, und jeweils im Abstand von einer Sekunde einen Wert ausgeben soll. Jedoch hat er alle 10 Werte in einem "Schlag ausgegeben", das entsprach 0,17 Sek oder so. Aber das mit der Schleife ist jetzt nicht so wichtig wenn der Job wirklich kontinuirlich im Hintergrund läuft.


                @Falk Prüfer

                Wo erwartest du die Ausgabe? Auf der Konsole des Servers? Oder wird die Ausgabe von DBMS_OUTPUT irgendwohin umgeleitet?
                Ich erwarte die Ausgabe auf der Konsole des Servers, da ich einfach nur testen will ob im Intervall von 1 Sekunde immer was ausgegeben wird.

                Wüsstest du einen Weg, wie man überprüft, ob der Job immer im Hintergrund im Intervall von 1 Sekunde läuft?


                Ich muss dieses Problem wirklich lösen, dies ist mir sehr wichtig.

                Ich bedanke mich für eure Unterstützung.

                Comment


                • #9
                  Run_Job dient der einmaligen, sofortigen Ausführung.

                  In Deinem Create_Job würde vermutlich ein zusätzliches Argument names Startdate oder so ausreichen. Das muss glaub ich in der Zukunft liegen.

                  Das ganze Paket dbms_scheduler ist sehr mächtig und es gibt eher dutzende als 1 Weg, ein bestimmtes Ziel zu erreichen. Dir muss klar sein, dass Du damit auch ziemlichen Blödsinn veranstalten kannst (Serverlast, Anzahl der Prozesse, konkurrierende Zugriffe ..) Schau Dir das hier mal an und überleg Dir genau, wie Du Deine Schedules aufbauen willst. 1 Sekundenintervall scheint mir ziemlich kurz bzw. häufig für was auch immer:

                  http://psoug.org/reference/dbms_scheduler.html

                  Das DBMS_OUTPUT ist einfach im Rahmen von Jobs / Schedules nicht zur Kontrolle geeignet, es läuft nicht in Deinem Kontext! Eigentlich bekommst Du alle notwendigen Infos aus diesen Views (gibt noch andere) bzw. den "all" Varianten. (oder mach aus Deinem Update in der Testtabelle ein Insert):

                  DBA_SCHEDULER_JOBS
                  DBA_SCHEDULER_JOB_LOG
                  DBA_SCHEDULER_JOB_RUN_DETAILS
                  DBA_SCHEDULER_RUNNING_JOBS
                  Gruß, defo

                  Comment


                  • #10
                    So, ich habe nun meinen Code implementiert und hoffe, dass der folgende Schedule jeden Tag einmal durchläuft und den Code, welchen ich eingefügt habe ausführt.

                    Code:
                    BEGIN
                    	DBMS_SCHEDULER.CREATE_JOB (
                    		 job_name => 'JOB'
                    		,job_type => 'PLSQL_BLOCK'
                    		,job_action => 
                    ' Hier wird der Code durchgeführt'
                    		,start_date => SYSDATE
                    		,repeat_interval => 'FREQ=DAILY;BYHOUR=0;byminute=0;bysecond=0;'
                    		,enabled => TRUE
                    		,comments => 'Einmal pro Tag wird ein Job ausgeführt..'
                            );
                    END;
                    Meint Ihr auch, dass der Job definitiv einmal pro Tag um genau 0 Uhr abläuft, solange er auf enabled ist?

                    Comment


                    • #11
                      Dazu kann man nichts sagen, weil die Ausführung des Jobs nicht nur von den Parametern an sich, sondern auch von dem Code abhängt. Den hast du nicht angegeben.

                      Braucht man aber auch gar nicht, weil Du das alles von den Admin Views ablesen kannst:

                      ALL_SCHEDULER_JOBS:

                      RUN_COUNT
                      FAILURE_COUNT
                      LAST_START_DATE
                      LAST_RUN_DURATION
                      NEXT_RUN_DATE

                      Um nicht in die Glaskugel schauen zu müssen, bietet sich hier für den Fehlerfall Exceptionhandling mit "when others" und geeigneten Benachrichtigungsmethoden an. Bspw. Email, io_file, log_table.. oder auch Kombinationen daraus an.
                      Gruß, defo

                      Comment

                      Working...
                      X