我正在尝试将具有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无法处理。
任何有关如何实现这一目标的指针?
答案 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
/