Преобразование LONG столбца в VARCHAR2 в представление - PullRequest
0 голосов
/ 12 июля 2019

Я пытаюсь преобразовать таблицу со столбцом LONG в столбец VARCHAR2 и создать представление из этого в Oracle 11g. Все остальные примеры, которые я читал я показал, как это сделать в запросе SELECT, но никогда в выражении CREATE OR REPLACE FORCE VIEW.

Я могу создавать представления и объекты в своем профиле пользователя и успешно запустить сценарий PL / SQL, который преобразовалполе LONG в VARCHAR со следующим скриптом:

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 не может с этим справиться.

Есть какие-нибудь указатели о том, как этого добиться?

1 Ответ

2 голосов
/ 12 июля 2019

Может быть интересно посмотреть, как Oracle самостоятельно решает эту проблему, поскольку они интенсивно используют LONG в словаре данных.

DBA_VIEWS, среди прочего, имеет столбцы TEXT (как LONG) и TEXT_VC как VARCHAR2,Это основано на внутреннем представлении INT $ DBA_VIEWS, где TEXT_VC получен из функции getlong (1, v.rowid).DBA_ARGUMENTS показывает параметры для этой функции: OPCODE и ROWID.

Трассировка (или вдохновенное возмущение v $ sql) показывает, что соответствует выполнению «выбрать текст из представления $, где 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
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...