2017-10-28 47 views
5

पृष्ठभूमि करने के लिए लंबी कास्ट करने के लिए: ALL_IND_EXPRESSIONS स्तंभकैसे VARCHAR2 इनलाइन

COLUMN_EXPRESSION LONG Function-based index expression defining the column 

मुझे पता है कि LONG बहिष्कृत हो गई है है। मैं की तरह कुछ लिखने (या अन्य पाठ संचालन करते हैं) की जरूरत है:

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 Demo

टिप्पणियां मिल गया :

  • इसे स्वयं निहित क्वेरी
  • कोई मध्यवर्ती ऑब्जेक्ट नहीं है (तालिका/दृश्य बनाना कोई विकल्प नहीं है)।
  • कोई PL/SQL block
  • DBMS_METADATA.GET_DDL (मामले में यह नहीं है)
  • WITH FUNCTION clause के रूप में अंतिम उपाय

यह LONG से VARCHAR2 को कास्ट करने के लिए निर्मित समारोह/परिवर्तित/उपयोग संभव है?

संपादित टी एल; डॉ:

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

[लंबे समय तक वर्चर 2 कनवर्ट करना] का संभावित डुप्लिकेट (https://stackoverflow.com/questions/31004844/converting-long-to-varchar2) –

+0

@CyrilleMODIANO उल्लेख किया गया उत्तर उपयोगी हो सकता है। 'एक से अधिक कथन का उपयोग करके लंबे समय से varchar2 में कनवर्ट करना संभव नहीं है, लंबे समय तक कुछ प्रतिबंध हैं।आधिकारिक दस्तावेज के लिए कोई लिंक? – lad2025

उत्तर

4

आप 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. 
+0

विचार के लिए धन्यवाद, मैं इसका परीक्षण करूंगा :) मुझे उम्मीद है कि यह मेरे सभी मामलों के लिए काम करेगा (मैं गैर-पारदर्शी एक्सएमएल के लिए अपवाद नहीं बनाना चाहता) – lad2025

2

Converting Long to Varchar2 से WITH FUNCTION और दृष्टिकोण का उपयोग करते हुए, लेकिन अभी भी यह किसी भी तरह बदसूरत और overcomplicated है।

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'; 

मुझे विश्वास है कि वहाँ इसे प्राप्त करने के लिए और अधिक सुरुचिपूर्ण तरीका होना चाहिए।

2

के रूप में खुद को ओरेकल विशेषज्ञों द्वारा कहा गया है, विरासत कारणों के लिए यह संभव नहीं substr एक एक VARCHAR2 को लंबी इनलाइन करने के लिए है। AskTom link

इस other link पर आपको प्रक्रिया के साथ और यहां तक ​​कि फ़ंक्शन के साथ भी ऐसा करने का तरीका मिलेगा यदि लंबा 32k लंबा छोटा हो।

और इस फ़ंक्शन को बाद में एक SELECT क्वेरी में बुलाया जा सकता है, जो आप प्राप्त करना चाहते हैं।

संबंधित मुद्दे