【问题标题】:Converting LONG column to VARCHAR2 into a view将 LONG 列转换为 VARCHAR2 到视图中
【发布时间】:2019-07-13 16:18:49
【问题描述】:

我正在尝试将具有 LONG 列的表转换为 VARCHAR2 列并在 Oracle 11g 中构建一个视图。 All the other examples I've been reading 已在 SELECT 中展示了如何做到这一点查询,但从不在 CREATE OR REPLACE FORCE VIEW 语句中。

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

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;

但是,我找不到将输出存储到视图中的方法。我尝试将上述脚本包装成CREATE VIEW,但Oracle 无法处理。

关于如何实现这一点的任何指示?

【问题讨论】:

    标签: oracle plsql view


    【解决方案1】:

    看看 Oracle 自己如何解决这个问题会很有趣,因为他们在数据字典中大量使用 LONG。

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

    一个跟踪(或对 v$sql 的启发)显示与“select text from view$ where 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
    /

    【讨论】:

    • 我需要稍微解释一下,但是谢谢!刚刚和我的同事谈过,他说不用担心长文本字段,因为他有另一种解决方法。
    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 2015-03-06
    • 1970-01-01
    • 2021-10-03
    • 2011-02-11
    • 2013-07-26
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多