Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle - dbms_utility.exec_ddl_statement का उपयोग कर कर्सर ठीक से क्रियान्वित नहीं कर रहा है

DBMS_UTILITY.EXEC_DDL_STATEMENT केवल मज़बूती से डीडीएल चलाता है। यदि आप इसे PL/SQL ब्लॉक के साथ चलाने का प्रयास करते हैं तो यह चुपचाप विफल हो जाएगा और कुछ भी नहीं चलाएगा।

यह एक पीएल/एसक्यूएल ब्लॉक चलाकर प्रदर्शित किया जा सकता है जो स्पष्ट रूप से विफल होना चाहिए। नीचे दिया गया कोड चाहिए जनरेट करें ORA-01476: divisor is equal to zero . लेकिन इसके बजाय यह कुछ नहीं करता है।

begin
    [email protected](
        q'[declare v_test number; begin v_test := 1/0; end;]'
    );
end;
/

पीएल/एसक्यूएल ब्लॉक को दूरस्थ रूप से चलाने के लिए अस्थायी प्रक्रिया का उपयोग करें। DBMS_UTILITY.EXEC_DDL_STATEMENT के साथ प्रक्रिया बनाएं और फिर इसे नेटिव डायनेमिक SQL के साथ कॉल करें।

begin
    [email protected](
        q'[
            create or replace procedure test_procedure
            is
                v_test number;
            begin
                v_test := 1/0;
            end;
        ]'
    );
    execute immediate 'begin [email protected]; end;';
end;
/

RESULTS:

ORA-01476: divisor is equal to zero
ORA-06512: at "JHELLER.TEST_PROCEDURE", line 5
ORA-06512: at line 1
ORA-06512: at line 12

मुझे लगता है कि यह व्यवहार एक बग है। Oracle को केवल कुछ न करने के बजाय एक त्रुटि देनी चाहिए।

संयोजन नरक में आपका स्वागत है। स्ट्रिंग्स गड़बड़ हो जाती हैं जब वे 4 स्तरों को गहराई से एम्बेड करते हैं। लेकिन कुछ चीजें हैं जो आप जीवन को आसान बनाने के लिए कर सकते हैं:

  1. नेस्टेड वैकल्पिक-उद्धरण तंत्र का प्रयोग करें। उदाहरण के लिए, q'[ ... ]' , एक q'< ... >' . के अंदर , आदि.
  2. मल्टी-लाइन स्ट्रिंग्स का उपयोग करें। कई पंक्तियों को जोड़ने की कोई आवश्यकता नहीं है, बस एक स्ट्रिंग का उपयोग करें।
  3. स्ट्रिंग के प्रारंभ और अंत की पहचान करने में सहायता के लिए अतिरिक्त रिक्ति का उपयोग करें। जब चीजें इतनी पागल हो जाती हैं तो यह एक स्ट्रिंग डिलीमीटर को एक लाइन पर अपने आप में डालने लायक है, ताकि सब कुछ लाइन अप करना आसान हो।
  4. REPLACE का उपयोग करें संयोजन के बजाय।

मैंने उन युक्तियों का उपयोग करके आपके कोड के भाग को पुन:स्वरूपित किया। स्टैक ओवरफ्लो वैकल्पिक उद्धरण तंत्र को नहीं समझता है, लेकिन एक अच्छे Oracle SQL संपादक में स्ट्रिंग्स को बेहतर दिखना चाहिए।

declare
    v_db_name varchar2(30) := 'myself';
    sql_update varchar2(32767);
begin
    execute immediate replace(
    q'[
        begin
            [email protected]#DB_NAME#
            (
                q'<
                    create or replace procedure cw_drop_table is
                        sql_drop varchar2(2000);
                    begin
                        sql_drop :=
                        q'{
                            BEGIN
                                EXECUTE IMMEDIATE 'DROP TABLE iSecurity2_dupes_bak';
                            EXCEPTION WHEN OTHERS THEN
                                IF SQLCODE != -942 THEN
                                    NULL;
                                END IF;
                            END;
                        }';
                        execute immediate sql_drop;
                    end;
                >'
            );
            execute immediate 'begin [email protected]#DB_NAME#; end;';
        end;
    ]', '#DB_NAME#', v_db_name);

    sql_update := 'create table iSecurity2_dupes_bak as select * from iSecurity2';
    execute immediate 'begin [email protected]'||v_db_name||
        '(:sql_update);  end;' using sql_update;
    commit;
end;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - अधिकांश कॉलम मिलान वाली पंक्तियाँ लौटाएँ

  2. JDBC का उपयोग करके संग्रहीत कार्यविधि से Oracle तालिका प्रकार प्राप्त करें

  3. Mac OS 10.10 . पर tnsnames.ora के साथ ROracle का उपयोग करके Oracle डेटाबेस से कनेक्ट करें

  4. Oracle के साथ भौतिकीकृत दृश्य

  5. ओरेकल:मैं ओरेकल एसक्यूएल में हेक्स को दशमलव में कैसे परिवर्तित करूं?