⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 submit.sql

📁 介绍Oracle PL SQL编程
💻 SQL
字号:
/*
 * Submit.sql
 * Chapter 17, Oracle10g PL/SQL Programming
 * by Ron Hardman, Mike McLaughlin, Scott Urman
 *
 * This script tests the DBMS_JOB.SUBMIT procedure
 */

SET VERIFY OFF
UNDEFINE job_number

exec CLEAN_SCHEMA.jobs
exec CLEAN_SCHEMA.procs
exec CLEAN_SCHEMA.tables

PROMPT
PROMPT Create email_tbl to hold e-mail details
PROMPT

CREATE TABLE email_tbl (
	EMAILID NUMBER(10) 
	      CONSTRAINT emailid_pk PRIMARY KEY,
	SENDER VARCHAR2(100 CHAR) 
	      NOT NULL,
	RECIPIENTS VARCHAR2(4000 CHAR) 
	      NOT NULL,
	CC VARCHAR2(4000),
	BCC VARCHAR2(4000),
	SUBJECT VARCHAR2(50),
	MESSAGE VARCHAR2(4000),
	ATTACHMENT VARCHAR2(4000),
	DATE_LOGGED TIMESTAMP DEFAULT SYSTIMESTAMP,
	DATE_SENT TIMESTAMP);

PROMPT
PROMPT Insert four sample e-mails -- modify if you wish to receive e-mails
PROMPT

INSERT INTO email_tbl
   VALUES (1, 'email1@myemail.com', 'email1@youremail.com', 
           'email1@someonesemail.com', 'email1@theotheremail.com',
           'Subject 1', 'This is the message for e-mail 1',
           'This is inline attachment 1', null, null);

INSERT INTO email_tbl
   VALUES (2, 'email2@myemail.com', 'email2@youremail.com', 
           'email2@someonesemail.com', 'email2@theotheremail.com',
           'Subject 2', 'This is the message for e-mail 2',
           'This is inline attachment 2', null, null);

INSERT INTO email_tbl
   VALUES (3, 'email3@myemail.com', 'email3@youremail.com', 
           'email3@someonesemail.com', 'email3@theotheremail.com',
           'Subject 3', 'This is the message for e-mail 3',
           'This is inline attachment 3', null, null);

INSERT INTO email_tbl
   VALUES (4, 'email4@myemail.com', 'email4@youremail.com', 
           'email4@someonesemail.com', 'email4@theotheremail.com',
           'Subject 4', 'This is the message for e-mail 4',
           'This is inline attachment 4', null, null);


INSERT INTO email_tbl
   VALUES (5, 'email5@myemail.com', 'email5@youremail.com', 
           'email5@someonesemail.com', 'email5@theotheremail.com',
           'Subject 5', 'This is the message for e-mail 5',
           'This is inline attachment 5', null, systimestamp);


INSERT INTO email_tbl
   VALUES (6, 'email6@myemail.com', 'email6@youremail.com', 
           'email6@someonesemail.com', 'email6@theotheremail.com',
           'Subject 6', 'This is the message for e-mail 6',
           'This is inline attachment 6', null, systimestamp);

COMMIT;

PROMPT 
PROMPT Create a package called email_manager to send e-mail messages
PROMPT

CREATE OR REPLACE PACKAGE email_manager
IS

   PROCEDURE smtp (i_host_string VARCHAR2);
   PROCEDURE inline_email;

END;
/



CREATE OR REPLACE PACKAGE BODY email_manager
IS

PROCEDURE smtp (i_host_string VARCHAR2)
AS

   v_host_string VARCHAR2(500) :=
                      i_host_string;
   v_conn_string UTL_SMTP.CONNECTION;

   CURSOR email_cur
   IS
   SELECT *
   FROM email_tbl
   WHERE DATE_SENT IS NULL;

BEGIN
   
   FOR y IN email_cur
   LOOP
      UTL_SMTP.HELO(v_conn_string, v_host_string);
      UTL_SMTP.MAIL(v_conn_string, y.sender);
      UTL_SMTP.RCPT(v_conn_string, y.recipients);
      UTL_SMTP.OPEN_DATA(v_conn_string);
      UTL_SMTP.WRITE_DATA(v_conn_string, y.message);
      UTL_SMTP.CLOSE_DATA(v_conn_string);
      UTL_SMTP.QUIT(v_conn_string);

      UPDATE email_tbl
      SET date_sent = systimestamp
      WHERE emailid = y.emailid;
   END LOOP;

   COMMIT;

EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
END smtp;

PROCEDURE inline_email
AS

   CURSOR email_cur
   IS
   SELECT * 
   FROM email_tbl
   WHERE DATE_SENT IS NULL;

BEGIN

   FOR y IN email_cur
   LOOP
      UTL_MAIL.SEND_ATTACH_VARCHAR2 (
         SENDER => y.sender,
         RECIPIENTS => y.recipients,
         CC => y.cc,
         BCC => y.bcc,
         SUBJECT => y.subject,
         MESSAGE => y.message,
         ATTACHMENT => y.attachment,
         ATT_INLINE => TRUE);

      UPDATE email_tbl
      SET date_sent = systimestamp
      WHERE emailid = y.emailid;
   END LOOP;

   COMMIT;

EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
END inline_email;

END;
/

PROMPT
PROMPT This procedure retrieves details about jobs
PROMPT

CREATE OR REPLACE PROCEDURE get_job_details(
   i_job_number IN NUMBER,
   cv_job_details IN OUT SYS_REFCURSOR)
IS
BEGIN
   OPEN cv_job_details FOR
   SELECT job, schema_user schema, 
          to_char(next_date, 'dd-mon-yyyy hh24:mi:ss') NEXT_DATE, 
          interval, what, broken
   FROM user_jobs
   WHERE job = i_job_number;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
END get_job_details;
/



PROMPT
PROMPT DBMS_JOB.SUBMIT examples
PROMPT


SET SERVEROUTPUT ON
DECLARE
   v_job_number NUMBER(10);
   v_instance_number NUMBER(10);

BEGIN

   -- Get the instance number for use with DBMS_JOB.SUBMIT
   SELECT instance_number 
   INTO v_instance_number
   FROM v$instance;

   -- Submit a job to begin tonight at midnight, and execute
   --  every half-hour thereafter
   DBMS_JOB.SUBMIT (JOB => v_job_number, 
                    WHAT => 'email_manager.smtp(''&mail_server'');', 
                    NEXT_DATE => TRUNC(SYSDATE + 1), 
                    INTERVAL => 'SYSDATE + 1/48', 
                    NO_PARSE => TRUE, 
                    INSTANCE => v_instance_number,
                    FORCE => NULL);
   COMMIT;
   DBMS_OUTPUT.PUT_LINE('The job number is: '||v_job_number);

END;
/

PROMPT
PROMPT Execute the GET_JOB_DETAILS procedure
PROMPT

VARIABLE v_job_details REFCURSOR
EXEC GET_JOB_DETAILS(&&job_number, :v_job_details)

COL schema FORMAT A15
COL next_date FORMAT A20
COL interval FORMAT A20
COL what FORMAT A60
PRINT v_job_details


PROMPT
PROMPT Create a job to purge the email_tbl table
PROMPT

DECLARE
   v_job_number NUMBER;
   v_instance_number NUMBER;
   v_statement VARCHAR2(500);
BEGIN

   -- Get the instance number for use with DBMS_JOB.SUBMIT
   SELECT i.instance_number
   INTO v_instance_number
   FROM v$instance i;

   v_statement := 'DELETE FROM email_tbl WHERE date_sent IS NOT NULL;';

   -- Submit a job to begin today, and execute
   --  ever Sunday at 11:45 PM.
   DBMS_JOB.SUBMIT (JOB => v_job_number, 
                    WHAT => v_statement, 
                    NEXT_DATE => TRUNC(SYSDATE + 1), 
                    INTERVAL => 'NEXT_DAY(TRUNC(SYSDATE), ''SUNDAY'') + 95/96', 
                    NO_PARSE => TRUE, 
                    INSTANCE => v_instance_number,
                    FORCE => NULL);
   COMMIT;
   DBMS_OUTPUT.PUT_LINE('The job number is: '||v_job_number);

END;
/

UNDEFINE JOB_NUMBER

VARIABLE v_job_details REFCURSOR
EXEC GET_JOB_DETAILS(&job_number, :v_job_details)

COL schema_user FORMAT A15
COL next_date FORMAT A20
COL interval FORMAT A60
COL what FORMAT A60
SET PAGES 9999
PRINT v_job_details

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -