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: 일치하지 않는 데이터 유형: 예상 번호가 길어졌습니다.
비고:
- 자기진단적 쿼리여야 합니다.
- 중간 개체 없음(테이블/뷰 만들기는 옵션이 아님).
- 아니요.
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';
그것을 이루기 위해서는 더 우아한 방법이 있어야 한다고 생각합니다.
오라클 전문가들이 직접 언급한 바와 같이, 기존의 이유로 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
'sourcecode' 카테고리의 다른 글
스위프트에서 UI 이미지를 색칠하려면 어떻게 해야 합니까? (0) | 2023.09.15 |
---|---|
PHP 7.0의 Laravel 5.4: PDO Exception - 드라이버를 찾을 수 없음(MySQL) (0) | 2023.09.15 |
Github: 개인 레포에 대한 읽기 전용 액세스 (0) | 2023.09.15 |
azure mariadb 서버에 키클로크 연결 (0) | 2023.09.15 |
루프 내에서 동적 변수 이름을 만들려면 어떻게 해야 합니까? (0) | 2023.09.15 |