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

पर्ल डीबीआई - एकाधिक कथनों के साथ SQL स्क्रिप्ट चलाएं

डेटाबेस नियंत्रित करता है कि एक समय में कितने कथन निष्पादित किए जा सकते हैं। मुझे याद नहीं आ रहा है कि क्या Oracle प्रति prepare में एकाधिक कथनों की अनुमति देता है या नहीं (MySQL करता है)। इसे आजमाएं:

my $dbh = DBI->connect(
    "dbi:Oracle:dbname",
    "username",
    "password",
    {
        ChopBlanks       => 1,
        AutoCommit       => 1,
        RaiseError       => 1,
        PrintError       => 1,
        FetchHashKeyName => 'NAME_lc',
    }
);
$dbh->do("
    CREATE TABLE test_dbi1 (
        test_dbi_intr_no    NUMBER(15),
        test_dbi_name       VARCHAR2(100)
    );

    UPDATE mytable 
        SET col1=1;

    CREATE TABLE test_dbi2 (
        test_dbi_intr_no    NUMBER(15),
        test_dbi_name       VARCHAR2(100)
    );
");

$dbh->disconnect;

बेशक, अगर आप बयानों को तोड़ते हैं तो आपको बेहतर त्रुटि प्रबंधन मिलता है। स्ट्रिंग को अलग-अलग कथनों में विभाजित करने के लिए आप एक साधारण पार्सर का उपयोग कर सकते हैं:

#!/usr/bin/perl

use strict;
use warnings;

my $sql = "
    CREATE TABLE test_dbi1 (
        test_dbi_intr_no    NUMBER(15),
        test_dbi_name       VARCHAR2(100)
    );

    UPDATE mytable
        SET col1=';yes;'
        WHERE col2=1;

    UPDATE mytable
        SET col1='Don\\'t use ;s and \\'s together, it is a pain'
        WHERE col2=1;


    CREATE TABLE test_dbi2 (
        test_dbi_intr_no    NUMBER(15),
        test_dbi_name       VARCHAR2(100)
    );
";

my @statements = ("");
#split the string into interesting pieces (i.e. tokens):
#   ' delimits strings
#   \ pass on the next character if inside a string
#   ; delimits statements unless it is in a string
#   and anything else
# NOTE: the grep { ord } is to get rid of the nul
# characters the split seems to be adding
my @tokens     = grep { ord } split /([\\';])/, $sql; 
# NOTE: this ' fixes the stupid SO syntax highlighter
#this is true if we are in a string and should ignore ; 
my $in_string  = 0;
my $escape     = 0;
#while there are still tokens to process
while (@tokens) {
    #grab the next token
    my $token = shift @tokens;
    #if we are in a string
    if ($in_string) {
        #add the token to the last statement
        $statements[-1] .= $token;
        #setup the escape if the token is \
        if ($token eq "\\") {
                $escape = 1;
                next;
        }
        #turn off $in_string if the token is ' and it isn't escaped
        $in_string = 0 if not $escape and $token eq "'";
        $escape = 0; #turn off escape if it was on
        #loop again to get the next token

        next;
    }
    #if the token is ; and we aren't in a string
    if ($token eq ';') {
        #create a new statement
        push @statements, "";
        #loop again to get the next token
        next;
    }
    #add the token to the last statement
    $statements[-1] .= $token;
    #if the token is ' then turn on $in_string
    $in_string = 1 if $token eq "'";
}
#only keep statements that are not blank
@statements = grep { /\S/ } @statements;

for my $i (0 .. $#statements) {
    print "statement $i:\n$statements[$i]\n\n";
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. विंडोज 10 पर Oracle SQL डेवलपर 18.2 कैसे स्थापित करें?

  2. Oracle .Net ManagedDataAccess त्रुटि:असेंबली से 'OracleInternal.Common.ConfigBaseClass' प्रकार लोड नहीं कर सका

  3. ओरेकल डेटाबेस स्टेटमेंट में ENABLE कीवर्ड का उपयोग करने का कारण / उपयोगिता क्या है?

  4. Oracle में DBMS_OUTPUT पैकेज के बारे में जानें

  5. plsql डेवलपर में दो से अधिक कॉलम कैसे संयोजित करें?