]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - maintenance/oracle/archives/patch_create_17_functions.sql
MediaWiki 1.17.0
[autoinstalls/mediawiki.git] / maintenance / oracle / archives / patch_create_17_functions.sql
1 define mw_prefix='{$wgDBprefix}';
2
3 /*$mw$*/
4 CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname   IN VARCHAR2,
5                                             p_oldprefix IN VARCHAR2,
6                                             p_newprefix IN VARCHAR2,
7                                             p_temporary IN BOOLEAN) IS
8   e_table_not_exist EXCEPTION;
9   PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942);
10   l_temp_ei_sql VARCHAR2(2000);
11 BEGIN
12   BEGIN
13     EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
14                       ' CASCADE CONSTRAINTS';
15   EXCEPTION
16     WHEN e_table_not_exist THEN
17       NULL;
18   END;
19   IF (p_temporary) THEN
20     EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
21                       p_tabname || ' AS SELECT * FROM ' || p_oldprefix ||
22                       p_tabname || ' WHERE ROWNUM = 0';
23   ELSE
24     EXECUTE IMMEDIATE 'CREATE TABLE ' || p_newprefix || p_tabname ||
25                       ' AS SELECT * FROM ' || p_oldprefix || p_tabname ||
26                       ' WHERE ROWNUM = 0';
27   END IF;
28   FOR rc IN (SELECT column_name, data_default
29                FROM user_tab_columns
30               WHERE table_name = p_oldprefix || p_tabname
31                 AND data_default IS NOT NULL) LOOP
32     EXECUTE IMMEDIATE 'ALTER TABLE ' || p_newprefix || p_tabname ||
33                       ' MODIFY ' || rc.column_name || ' DEFAULT ' ||
34                       SUBSTR(rc.data_default, 1, 2000);
35   END LOOP;
36   FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('CONSTRAINT',
37                                                                           constraint_name),
38                                                     32767,
39                                                     1),
40                                     USER || '"."' || p_oldprefix,
41                                     USER || '"."' || p_newprefix),
42                             '"' || constraint_name || '"',
43                             '"' || p_newprefix || constraint_name || '"') DDLVC2,
44                     constraint_name
45                FROM user_constraints uc
46               WHERE table_name = p_oldprefix || p_tabname
47                 AND constraint_type = 'P') LOOP
48     l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
49     l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, 'PRIMARY KEY')+1)+1);
50     EXECUTE IMMEDIATE l_temp_ei_sql;
51   END LOOP;
52   IF (NOT p_temporary) THEN
53   FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
54                                                                   constraint_name),
55                                             32767,
56                                             1),
57                             USER || '"."' || p_oldprefix,
58                             USER || '"."' || p_newprefix) DDLVC2,
59                     constraint_name
60                FROM user_constraints uc
61               WHERE table_name = p_oldprefix || p_tabname
62                 AND constraint_type = 'R') LOOP
63     EXECUTE IMMEDIATE rc.ddlvc2;
64   END LOOP;
65   END IF;
66   FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
67                                                                           index_name),
68                                                     32767,
69                                                     1),
70                                     USER || '"."' || p_oldprefix,
71                                     USER || '"."' || p_newprefix),
72                             '"' || index_name || '"',
73                             '"' || p_newprefix || index_name || '"') DDLVC2,
74                     index_name,
75                     index_type
76                FROM user_indexes ui
77               WHERE table_name = p_oldprefix || p_tabname
78                 AND index_type NOT IN ('LOB', 'DOMAIN')
79                 AND NOT EXISTS
80               (SELECT NULL
81                        FROM user_constraints
82                       WHERE table_name = ui.table_name
83                         AND constraint_name = ui.index_name)) LOOP
84     l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
85     l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, '"' || USER || '"."' || p_newprefix || '"')+1)+1);
86     EXECUTE IMMEDIATE l_temp_ei_sql;
87   END LOOP;
88   FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('TRIGGER',
89                                                                                 trigger_name),
90                                                           32767,
91                                                           1)),
92                                     USER || '"."' || p_oldprefix,
93                                     USER || '"."' || p_newprefix),
94                             ' ON ' || p_oldprefix || p_tabname,
95                             ' ON ' || p_newprefix || p_tabname) DDLVC2,
96                     trigger_name
97                FROM user_triggers
98               WHERE table_name = p_oldprefix || p_tabname) LOOP
99     l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
100     dbms_output.put_line(l_temp_ei_sql);
101     EXECUTE IMMEDIATE l_temp_ei_sql;
102   END LOOP;
103 END;
104 /*$mw$*/
105
106 CREATE OR REPLACE TYPE GET_OUTPUT_TYPE IS TABLE OF VARCHAR2(255);
107
108 /*$mw$*/
109 CREATE OR REPLACE FUNCTION GET_OUTPUT_LINES RETURN GET_OUTPUT_TYPE PIPELINED AS
110   v_line VARCHAR2(255);
111   v_status INTEGER := 0;
112 BEGIN
113
114   LOOP
115     DBMS_OUTPUT.GET_LINE(v_line, v_status);
116     IF (v_status = 0) THEN RETURN; END IF;
117     PIPE ROW (v_line);
118   END LOOP;
119   RETURN;
120 EXCEPTION
121   WHEN OTHERS THEN
122     RETURN;
123 END;
124 /*$mw$*/
125