sourcecode

VARCHAR2 인라인으로 롱 캐스트하는 방법

codebag 2023. 9. 15. 20:58
반응형

VARCHAR2 인라인으로 롱 캐스트하는 방법

배경: 열 있음

COLUMN_EXPRESSION   LONG   Function-based index expression defining the column

저는 그것이 감가상각되었다는 것을 압니다.다음과 같은 내용을 작성해야 합니다(또는 다른 텍스트 작업을 수행합니다).

SELECT 
  REPLACE(REPLACE(REPLACE(
    q'{ALTER INDEX "<index_owner>"."<index_name>" ON ... (<column_expression>)}'
   ,'<index_owner>', index_owner )
   ,'<index_name>', index_name) 
   ,'<column_expression>', column_expression) AS result
FROM all_ind_expressions;

ORA-00932: 일치하지 않는 데이터 유형: 예상 번호가 길어졌습니다.

DBFiddle 데모

비고:

  • 자기진단적 쿼리여야 합니다.
  • 중간 개체 없음(테이블/뷰 만들기는 옵션이 아님).
  • 아니요.PL/SQL block
  • DBMS_METADATA.GET_DDL(해당되지 않음)
  • 기능 조항을 최후의 수단으로 사용

내장 기능을 주조/변환/사용할 수 있습니까?LONG로.VARCHAR2?

편집 TL;DR:

SELECT column_expression || 'a'  -- convert to working code
FROM all_ind_expressions;

식에 XML 구문 분석을 중단시킬 수 있는 내용이 포함되어 있지 않다면 XML을 사용할 수 있습니다.

select *
  from xmltable(
          '/ROWSET/ROW'
          passing (select dbms_xmlgen.getxmltype('select * from all_ind_expressions
                                                   where index_name = ''XDB$COMPLEX_TYPE_AK''')
                     from dual)
          columns index_owner varchar2(30) path 'INDEX_OWNER',
                  index_name varchar2(30) path 'INDEX_NAME',
                  table_owner varchar2(30) path 'TABLE_OWNER',
                  table_name varchar2(30) path 'TABLE_NAME',
                  column_expression varchar2(4000) path 'COLUMN_EXPRESSION')

INDEX_OWNER     INDEX_NAME           TABLE_OWNER     TABLE_NAME           COLUMN_EXPRESSION                  
--------------- -------------------- --------------- -------------------- -----------------------------------
XDB             XDB$COMPLEX_TYPE_AK  XDB             XDB$COMPLEX_TYPE     SYS_OP_R2O("XMLDATA"."ALL_KID")    
1 row selected.

사용.WITH FUNCTION그리고 Conversing Long에서 Varchar2로 접근하지만 여전히 다소 추하고 너무 복잡합니다.

CREATE TABLE TEST(Z INT);
CREATE INDEX IF_DOUBLE_TEST_Z ON TEST(Z*2);

쿼리:

WITH FUNCTION s_convert(pindex_owner VARCHAR2, pindex_name VARCHAR2,
                        ptable_owner VARCHAR2, ptable_name VARCHAR2) 
               RETURN VARCHAR2
AS
  VAR1 LONG;
  VAR2 VARCHAR2(4000);
BEGIN
  SELECT column_expression 
  INTO VAR1 
  FROM all_ind_expressions
  WHERE index_owner = pindex_owner AND index_name = pindex_name
    AND table_owner = ptable_owner AND table_name = ptable_name
    AND column_position = 1;  -- only one column indexes

  VAR2 := SUBSTR(VAR1, 1, 4000);
  RETURN VAR2;
END;
SELECT aie.*, 
  REPLACE(REPLACE(REPLACE(
     q'{ALTER INDEX "<index_owner>"."<index_name>" ON ... (<column_expression>)}'
     ,'<index_owner>', index_owner )
     ,'<index_name>', index_name) 
     ,'<column_expression>', 
       s_convert(index_owner, index_name, table_owner, table_name)) AS result
FROM all_ind_expressions aie
WHERE TABLE_NAME='TEST';

db<>dle demo

그것을 이루기 위해서는 더 우아한 방법이 있어야 한다고 생각합니다.

오라클 전문가들이 직접 언급한 바와 같이, 기존의 이유로 VARCHAR2에 길게 인라인 서브스트레이트를 수행할 수 없습니다. 링크에게 물어보세요.

다른 링크에서는 LONG이 32k LONG보다 짧은 경우 프로시저 및 함수를 사용하여 수행하는 방법을 찾을 수 있습니다.

그리고 이 함수는 나중에 SELECT 쿼리에서 호출할 수 있는데, 이것은 여러분이 달성하고 싶은 것입니다.

긴 시간을 다루는 가장 좋은 방법은 다음과 같습니다: 1) 로브 타입으로 임시 테이블을 만듭니다. (예:CLOB).2) Oracle에서 유일하게 허용되는 구문을 사용합니다. "TO_LOB는 long_column에 있는 LONG 또는 LONG RAW 값을 LOB 값으로 변환합니다.이 함수는 LONG 또는 LONG RAW 열에만 적용할 수 있으며 INSERT 문에 있는 하위 쿼리의 선택 목록에만 적용할 수 있습니다." 3) 임시 테이블을 이용하여 작업을 수행합니다.

언급URL : https://stackoverflow.com/questions/46991132/how-to-cast-long-to-varchar2-inline

반응형