動態SQL(二)

1.無綁定變量的動態語句:靜態字符串的動態語句形式,因爲Oracle不支持條件下'存在則刪除'語法,使用靜態字符串作爲NDS語句最主要的用途在於,當對象存在時,在重新創建之前先刪除已存在的對象。

BEGIN
    FOR i IN (SELECT NULL FROM user_objects WHERE object_name = 'TRANSATION')
    LOOP
        EXECUTE IMMEDIATE 'DROP TABLE TRANSATION CASCADE CONSTRAINTS';
    END LOOP;
END;

改進:

BEGIN
    FOR i IN (SELECT object_name, object_type
                FROM user_objects
               WHERE regexp_like(object_name, 'TRANSACTION.'))
    LOOP
        IF i.object_type = 'SEQUENCE'
        THEN
            EXECUTE IMMEDIATE 'DROP SEQUENCE ' || i.object_name;
        ELSIF i.object_type = 'TABLE'
        THEN
            EXECUTE IMMEDIATE 'DROP TABLE ' || i.object_name ||
                              ' cascade constraints';
        END IF;
    END LOOP;
END;



CREATE OR REPLACE PROCEDURE insert_lookup(table_name     VARCHAR2,
                                          lookup_table   VARCHAR2,
                                          lookup_column  VARCHAR2,
                                          lookup_type    VARCHAR2,
                                          lookup_code    VARCHAR2 := ' ',
                                          lookup_meaning VARCHAR2) IS
    stmt VARCHAR2(2000);
BEGIN
    stmt := 'insert into ' || dbms_assert.simple_sql_name(table_name) ||
            ' values ' || '(common_lookup_s1.nextval ' || ',' ||
            dbms_assert.enquote_literal(lookup_table) || ',' ||
            dbms_assert.enquote_literal(lookup_column) || ',' ||
            dbms_assert.enquote_literal(lookup_type) || ',' ||
            dbms_assert.enquote_literal(lookup_code) || ',' ||
            dbms_assert.enquote_literal(lookup_meaning) ||
            ',3,sysdate,3,sysdate)';
    --dbms_output.put_line(stmt);
    EXECUTE IMMEDIATE stmt;
END insert_lookup;


2.帶綁定變量的動態語句:

CREATE OR REPLACE PROCEDURE insert_lookup_1(table_name     VARCHAR2,
                                            lookup_table   VARCHAR2,
                                            lookup_column  VARCHAR2,
                                            lookup_type    VARCHAR2,
                                            lookup_code    VARCHAR2,
                                            lookup_meaning VARCHAR2) IS
    stmt VARCHAR2(2000);
BEGIN
    stmt := 'insert into ' || dbms_assert.simple_sql_name(table_name) ||
            ' values ' || '(common_lookup_s1.nextval ', ||
            ' :lookup_table ', || ' :lookup_column ', || ' :lookup_type ', ||
            ' :lookup_code ', || ' :looup_meaning', ||
            ' 3,sysdate,3 sysdate)';
    dbms_output.put_line(stmt);
    EXECUTE IMMEDIATE stmt;
    USING lookup_table, lookup_column, lookup_type, lookup_code, lookup_meaning;
END;


DECLARE
    TYPE lookup_record IS RECORD --record structure
    (
        lookup_type    VARCHAR2(30),
        lookup_code    VARCHAR2(5),
        lookup_meaning VARCHAR2(255));
    lookup_cursor SYS_REFCURSOR;
    lookup_row    lookup_record;
    stmt          VARCHAR2(2000);
BEGIN
    stmt := 'SELECT common_lookup_type,' || ' common_lookup_code,' ||
            'common_lookup_meaning' || ' from common_lookup ' ||
            'where regexp_like(common_lookup_type,:input)';
    --dbms_output.put_line(stmt);
    OPEN lookup_cursor FOR stmt
        USING '(CR|D)E(D|B)IT';
    LOOP
        FETCH lookup_cursor
            INTO lookup_row;
        EXIT WHEN lookup_cursor%NOTFOUND;
        dbms_output.put_line('[' || lookup_row.lookup_type || '][' ||
                             lookup_row.lookup_code || ']');
    END LOOP;
    CLOSE lookup_cursor;
END;

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