将LONG列转换为VARCHAR2的视图

时间:2019-07-11 21:39:06

标签: oracle plsql view

我正在尝试将具有LONG列的表转换为VARCHAR2列,并在Oracle 11g中基于该视图构建视图。 All the other examples I've been reading在{ {1}}查询,但绝不使用SELECT语句。

我可以在用户配置文件下创建视图和对象,并成功运行了一个PL / SQL脚本,该脚本使用以下脚本将LONG字段转换为VARCHAR:

CREATE OR REPLACE FORCE VIEW

但是,我找不到将输出存储到视图中的方法。我尝试将上述脚本包装到DECLARE LONGCOMMENTS LONG; VAR2 VARCHAR2(4000); BEGIN SELECT PGX.COMMENTS INTO LONGCOMMENTS FROM USER.PGX WHERE ROWNUM < 100; VAR2 := SUBSTR(LONGCOMMENTS, 1, 4000); PGX.COMMENTS:=DBMS_OUTPUT.PUT_LINE(VAR2); END; 中,但是Oracle无法处理。

任何有关如何实现这一目标的指针?

1 个答案:

答案 0 :(得分:2)

看看Oracle本身是如何解决该问题的,这很有趣,因为他们在数据字典中大量使用LONG。

DBA_VIEWS除其他外,具有TEXT(作为LONG)列和TEXT_VC作为VARCHAR2列。这基于内部视图INT $ DBA_VIEWS,其中TEXT_VC从函数getlong(1,v.rowid)派生。 DBA_ARGUMENTS显示该函数的参数是OPCODE和ROWID。

跟踪(或启发性地浏览v $ sql)显示与执行“从view $中选择文本,其中rowid =:1”相对应。

因此,基本上,它们具有一个PL / SQL函数,该函数将列选择为varchar2变量并返回该变量。

如果您不想创建独立的功能,则最新版本的Oracle可以将其包含在视图中:

create or replace view my_views as
WITH
 FUNCTION view_text(i_name VARCHAR2) RETURN VARCHAR2 IS
   v_ret varchar2(32000);
 BEGIN
   execute immediate 'select text from user_views where view_name = :name' into v_ret using i_name ;
   RETURN substr(v_ret,1,4000);
 END;
select view_name, view_text(view_name) view_text
from user_views
/