मैं एक विरासत डेटाबेस पर काम कर रहा हूं जो Oracle 7 है और मैं varchar में कनवर्ट किए गए बाइट्स को निष्पादित करने के लिए तत्काल निष्पादित का उपयोग करना चाहता हूं लेकिन मैंने पाया उक्त समारोह को जारी किया गया था Oracle 10g

यहाँ मेरा उदाहरण है:

संग्रहीत प्रक्रिया:

create or replace procedure QUERY_EXECUTOR
(
    IN_QUERY_STATEMENT IN LONG RAW
)
AS
BEGIN

    declare CONVERTED_QUERY varchar2(32767); 
    cursor c1 is select IN_QUERY_STATEMENT from dual;
    BEGIN  
        for r2 in c1 loop
        converted_query:=UTL_RAW.CAST_TO_VARCHAR2(substr(r2.IN_QUERY_STATEMENT,0)); 
        dbms_output.put_line(converted_query);
        end loop;
        execute immediate converted_query; --THIS LINE
    END;

END;

तत्काल निष्पादित करें आदेश देखें। जब मैं इसे टिप्पणी करता हूं। एसपी ओरेकल 7 में सफलतापूर्वक संकलित हुआ।

लेकिन Oracle 12g (जिसे हम वर्तमान में उपयोग कर रहे हैं) पर, नमूना कोड ठीक चलता है।

EXEC QUERY_EXECUTOR('53454c45435420312046524f4d204455414c3b');

जब परिवर्तित किया जाता है तो "DUAL से 1 चुनें;";

यह रूपांतरण और निष्पादन हमारे लिए हमारी वर्तमान समस्या को संभालने का सबसे अच्छा तरीका है, इसलिए उत्तरों की बहुत सराहना की जाएगी।

प्रश्न

क्या कोई तरीका या वैकल्पिक समाधान है यदि हम Oracle 7 में उक्त कमांड का उपयोग नहीं कर सकते हैं?

संपादित करें:

यह विषय मिला जो क्रियान्वित करने की अन्य उपयोगिता है शाब्दिक स्ट्रिंग कमांड लेकिन यह केवल डीडीएल कमांड के लिए है।

संपादित करें 2: समाधान

सर @Wernfried Domscheit के जवाब ने मेरे लिए काम किया। मैंने उत्तर को अपने तर्क के साथ जोड़ दिया। हालांकि यह सही नहीं है और मुझे लगता है कि मुझे और दस्तावेज पढ़ने की जरूरत है।

सबसे पहले, ऐसा लगता है कि DBMS_SQL.VARCHAR2A Oracle7 में काम नहीं कर रहा है।

फिर मुझे यह मिला जिसमें एक अलग DBMS_SQL.PARSE विधि हस्ताक्षर। मैंने इसका इस्तेमाल किया क्योंकि यह DBMS_SQL.V7 कहता है, इसलिए यह Oracle 7 हो सकता है लेकिन मैं वास्तव में नहीं जानता। मुझे दस्तावेजों को पढ़ने की जरूरत है।

create or replace procedure QUERY_EXECUTOR
(
    IN_QUERY_STATEMENT IN LONG RAW
)
AS
BEGIN
DECLARE
    res INTEGER;
    cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
    CONVERTED_QUERY varchar2(32767);
    cursor c1 is select IN_QUERY_STATEMENT from dual;
    BEGIN
        for r2 in c1 loop
            converted_query:=UTL_RAW.CAST_TO_VARCHAR2(substr(r2.IN_QUERY_STATEMENT,0)); 
        end loop;
        DBMS_SQL.PARSE(cur, converted_query, DBMS_SQL.V7);
        dbms_output.put_line(cur);
        res := DBMS_SQL.EXECUTE(cur);
        DBMS_SQL.CLOSE_CURSOR(cur);
    END;
END;

PS:

मैं डीबीए नहीं हूं इसलिए कृपया अगर मैं समाधान के हिस्से में कुछ गलत कर रहा हूं, तो क्या आप बेहतर समाधान के लिए अपनी राय दे सकते हैं? उत्तर की बहुत सराहना की।

0
TraxX 8 अगस्त 2019, 06:52

2 जवाब

सबसे बढ़िया उत्तर

डायनामिक पूर्व Oracle 8i के लिए आपको DBMS_SQL पैकेज का उपयोग करना होगा . इस तरह होगा:

DECLARE
   sqlcmd DBMS_SQL.VARCHAR2A;
   res INTEGER;
   cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;

BEGIN

    sqlcmd(1) := 'SELECT 1';
    sqlcmd(sqlcmd.LAST+1) := 'FROM dual';

    DBMS_SQL.PARSE(cur, sqlcmd, sqlcmd.FIRST, sqlcmd.LAST, TRUE, DBMS_SQL.NATIVE); 
    res := DBMS_SQL.EXECUTE(cur);
    DBMS_SQL.CLOSE_CURSOR(cur);

END;

जहां तक ​​मुझे याद है DBMS_SQL.VARCHAR2A को हाल ही में पेश किया गया था, शायद आपको DBMS_SQL.VARCHAR2_TABLE या DBMS_SQL.VARCHAR2S का उपयोग करना होगा।

SELECT से परिणाम प्राप्त करने के लिए आपको FETCH_ROWS या EXECUTE_AND_FETCH फ़ंक्शंस का उपयोग करना होगा, दस्तावेज़ीकरण आपकी मदद करेगा।

3
APC 8 अगस्त 2019, 10:54

अगर मैं आपको सही समझता हूं तो आपका प्रश्न है: मैं ओरेकल 7 में गतिशील एसक्यूएल कैसे निष्पादित कर सकता हूं।

Oracle 7 में pl/sql 'execute' कमांड मौजूद नहीं है लेकिन पैकेज 'dbms_sql' मौजूद है और इसका वर्णन किया गया है PL/SQL उपयोगकर्ता मार्गदर्शिका और संदर्भ, रिलीज़ 2.3, भाग संख्या A32542-1 को 'अध्याय 5: ओरेकल के साथ बातचीत' का पृष्ठ 5-7 और Oracle 7 सर्वर एप्लिकेशन डेवलपर गाइड, रिलीज़ 7.3, भाग संख्या A32536-1 में 'अध्याय 10: गतिशील एसक्यूएल का उपयोग', पीपी 10-1

1
miracle173 8 अगस्त 2019, 08:53