A
Another way how to query LONG columns with SQL is to create function (or packaged function) for each column you need to convert.
FUNCTION get_user_views_text ( in_view_name user_views.view_name%TYPE ) RETURN VARCHAR2 AS out_text user_views.text%TYPE; BEGIN SELECT v.text INTO out_text FROM user_views v WHERE v.view_name = in_view_name; -- RETURN out_text; END;
Use function in SQL:
SELECT v.view_name, v.text_length, get_user_views_text(v.view_name) AS text FROM user_views v ORDER BY 1;
Or you can create dynamic function:
FUNCTION get_long_string ( in_table_name VARCHAR2, in_column_name VARCHAR2, in_where_col1_name VARCHAR2, in_where_val1 VARCHAR2, in_where_col2_name VARCHAR2 := NULL, in_where_val2 VARCHAR2 := NULL ) RETURN VARCHAR2 AS l_query VARCHAR2(4000); l_cursor INTEGER := DBMS_SQL.OPEN_CURSOR; l_buflen PLS_INTEGER := 4000; l_result PLS_INTEGER; -- out_value VARCHAR2(4000); out_value_len PLS_INTEGER; BEGIN l_query := 'SELECT ' || in_column_name || ' FROM ' || in_table_name || ' WHERE ' || in_where_col1_name || ' = :val1'; -- IF in_where_col2_name IS NOT NULL THEN l_query := l_query || ' AND ' || in_where_col2_name || ' = :val2'; END IF; -- DBMS_SQL.PARSE(l_cursor, l_query, DBMS_SQL.NATIVE); DBMS_SQL.BIND_VARIABLE(l_cursor, ':val1', in_where_val1); -- IF in_where_col2_name IS NOT NULL THEN DBMS_SQL.BIND_VARIABLE(l_cursor, ':val2', in_where_val2); END IF; -- DBMS_SQL.DEFINE_COLUMN_LONG(l_cursor, 1); -- l_result := DBMS_SQL.EXECUTE(l_cursor); IF DBMS_SQL.FETCH_ROWS(l_cursor) > 0 THEN DBMS_SQL.COLUMN_VALUE_LONG(l_cursor, 1, l_buflen, 0, out_value, out_value_len); END IF; DBMS_SQL.CLOSE_CURSOR(l_cursor); -- RETURN out_value; END;
And use this function in SQL:
SELECT v.view_name, v.text_length, get_long_string('USER_VIEWS', 'TEXT', 'VIEW_NAME', v.view_name) AS text FROM user_views v ORDER BY 1;
You can query Oracle Dictionary and get a list of all LONG columns:
SELECT t.table_name, t.column_name FROM all_tab_columns t WHERE t.owner = 'SYS' AND t.table_name LIKE 'USER%' AND t.data_type IN ('LONG', 'LONG RAW') ORDER BY 1, 2;
Comments
Post a Comment