S
Searching views source code is very difficult due to usage of prehistoric LONG data type. This script converts views to similar structure as user_source view.
Let's create target table first:
--DROP TABLE src_views;
CREATE TABLE src_views (
name VARCHAR2(30) NOT NULL,
line NUMBER(8) NOT NULL,
text VARCHAR2(4000),
--
CONSTRAINT pk_src_views
PRIMARY KEY (name, line)
);
Run the script:
DECLARE
in_view_name CONSTANT VARCHAR2(30) := '%';
--
PROCEDURE save_line_to_table (
in_name src_views.name%TYPE,
in_line src_views.line%TYPE,
in_text src_views.text%TYPE
) AS
BEGIN
INSERT INTO src_views (name, line, text)
VALUES (
in_name,
in_line,
in_text
);
END;
--
PROCEDURE clob_to_lines (
in_name VARCHAR2,
in_clob CLOB
) AS
clob_len PLS_INTEGER := DBMS_LOB.GETLENGTH(in_clob);
clob_line PLS_INTEGER := 1;
offset PLS_INTEGER := 1;
amount PLS_INTEGER := 32767;
buffer VARCHAR2(32767);
BEGIN
WHILE offset < clob_len LOOP
IF INSTR(in_clob, CHR(10), offset) = 0 THEN
amount := clob_len - offset + 1;
ELSE
amount := INSTR(in_clob, CHR(10), offset) - offset;
END IF;
--
IF amount = 0 THEN
buffer := '';
ELSE
DBMS_LOB.READ(in_clob, amount, offset, buffer);
END IF;
--
save_line_to_table (
in_name => in_name,
in_line => clob_line,
in_text => REPLACE(REPLACE(buffer, CHR(13), ''), CHR(10), '')
);
--
clob_line := clob_line + 1;
IF INSTR(in_clob, CHR(10), offset) = clob_len THEN
buffer := '';
END IF;
offset := offset + amount + 1;
END LOOP;
END;
BEGIN
DELETE FROM src_views v
WHERE v.name LIKE in_view_name;
--
FOR c IN (
SELECT v.view_name, DBMS_METADATA.GET_DDL('VIEW', v.view_name) AS content
FROM user_views v
WHERE v.view_name LIKE in_view_name
ORDER BY 1
) LOOP
DBMS_OUTPUT.PUT_LINE(c.view_name);
clob_to_lines(c.view_name, REGEXP_REPLACE(c.content, '^(\s*)', ''));
END LOOP;
END;
/
Check results:
SELECT * FROM src_views ORDER BY 1, 2;
If you need LONG content as CLOB, you can use this neat trick:
--DROP TABLE src_views_clob;
CREATE TABLE src_views_clob (
name VARCHAR2(30) NOT NULL,
content CLOB,
--
CONSTRAINT pk_src_views_clob
PRIMARY KEY (name)
);
--
INSERT INTO src_views_clob
SELECT view_name, TO_LOB(text) AS content
FROM user_views;
Comments
Post a Comment