在PLSQL中使用DML

1.使用SELECT INTO 進行變量初始化:

DECLARE
    v_average_cost VARCHAR2(10);
BEGIN
    SELECT to_char(AVG(cost), '$9,999.99') INTO v_average_cost FROM course;
    dbms_output.put_line('The average cost of a' ||
                         'course in the CTA program is' || v_average_cost);
END;

在簡單的PL/SQL語句塊中,數據定義語言(Data Definition Language,DDL)是無效的。(使用更高級的計時,諸如DBMS_SQL包中的過程就能夠使用DDL)。但是,通過變量,或者在PL/SQL語句塊中使用DML語句,就可以非常容易實現DML操作。

DECLARE
    v_city zipcode.city%TYPE;
BEGIN
    SELECT 'COLUMBUS' INTO v_city FROM dual;
    UPDATE zipcode SET city = v_city WHERE zip = 43224;
END;

也可以在PL/SQL語句塊中往數據庫中插入數據,

DECLARE
    v_zip  zipcode.zip%TYPE;
    v_user zipcode.created_by%TYPE;
    v_date zipcode.created_date%TYPE;
BEGIN
    SELECT 43438, USER, SYSDATE INTO v_zip, v_user, v_date FROM dual;
    INSERT INTO zipcode
        (zip, created_by, created_date, modified_by, modified_date)
    VALUES
        (v_zip, v_user, v_date, v_user, v_date);
END;

2.在PLSQL語句塊中使用DML

編寫一個PLSQL語句塊,向student表中插入一條新的學生記錄。

DECLARE
    v_max_id NUMBER;
BEGIN
    SELECT MAX(student_id) INTO v_max_id FROM student;
    INSERT INTO student
(student_id,
         last_name,
         zip,
         created_by,
         created_date,
         modified_by,
         modified_date,
         registration_date)
    VALUES
        (v_max_id,
         'Rosenzweig',
         11238,
         'BROSENZ',
         '01-JAN-99',
         'BROSENZ',
         '01-JAN-99',
         '01-JAN-99');
END;

在PLSQL語句塊中使用序列:

DECLARE
    v_user student.created_by%TYPE;
    v_date student.created_date%TYPE;
BEGIN
    SELECT USER, SYSDATE INTO v_user, v_date FROM dual;
    INSERT INTO student
        (student_id,
         last_name,
         zip,
         created_by,
         created_date,
         modified_by,
         modified_date,
         registration_date)
    VALUES
        (student_id_seq.nextval,
         'Smith',
         11238,
         v_user,
         v_date,
         v_user,
         v_date,
         v_date);
END;

在PLSQL語句塊中使用COMMIT,ROLLBACK和SAVEPOINT

BEGIN
    INSERT INTO student
        (student_id,
         last_name,
         zip,
         registration_date,
         created_by,
         created_date,
         modified_by,
         modified_date)
    VALUES
        (student_id_seq.nextval,
         'Tashi',
         10015,
         '01-JAN-99',
         'STUDENTA',
         '01-JAN-99',
         'STUDENTA',
         '01-JAN-99');
    SAVEPOINT a;
    INSERT INTO student
        (student_id,
         last_name,
         zip,
         registration_date,
         created_by,
         created_date,
         modified_by,
         modified_date)
    VALUES
        (student_id_seq.nextval,
         'Sonam',
         10015,
         '01-JAN-99',
         'STUDENTB',
         '01-JAN-99',
         'STUDENTB',
         '01-JAN-99');
    SAVEPOINT b;
    INSERT INTO student
        (student_id,
         last_name,
         zip,
         registration_date,
         created_by,
         created_date,
         modified_by,
         modified_date)
    VALUES
        (student_id_seq.nextval,
         'Norbu',
         10015,
         '01-JAN-99',
         'STUDENTB',
         '01-JAN-99',
         'STUDENTB',
         '01-JAN-99');
    SAVEPOINT c;
    ROLLBACK TO b;
END;

單個PLSQL包含多個事務:

DECLARE
    v_counter NUMBER;
BEGIN
    v_counter := 0;
    FOR i IN 1 .. 100
    LOOP
        v_counter := v_counter + 1;
        IF v_counter = 10
        THEN
            COMMIT;
            v_counter := 0;
        END IF;
    END LOOP;
END;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章