web-dev-qa-db-fra.com

Utilisation des transactions dans SQLPlus

Je viens à Oracle de PostgreSQL. Dans PostgreSQL, je peux utiliser l'outil de ligne de commande, PSQL, pour exécuter une suppression ou une mise à jour dans une transaction:

dbpool.production=> begin;
BEGIN
dbpool.production=*> delete from foo where account_id like '%1000%';
DELETE 9
dbpool.production=*> commit;
COMMIT
dbpool.production=> 

J'aime voir que j'ai eu le comte que je m'attendais avant d'avoir commis la transaction.

Les choses ne fonctionnent pas comme celle de SQLPlus, l'outil Oracle Command-Line. Quand je tape "commencer", il commence juste à lire plus d'intrants, ne rien faire apparemment:

SQL> begin;
  2  update opacs_work_orders set customer_id = null;
  3  commit;
  4

Comment puis-je utiliser SQLPlus, exécuter une ou plusieurs déclarations avec une transaction?

3
Wayne Conrad

Vous n'utilisez simplement pas begin dans SQLPlus si vous allez simplement émettre une série de requêtes SQL. Vous êtes déjà dans une transaction dès que vous émettez des SQL. Vous ne pouvez pas vraiment être en dehors d'une transaction de toute façon à des fins pratiques (bien sûr, si vous venez de vous connecter, ou simplement de vous engager et n'avez rien encore commencé, eh bien, vous n'êtes pas dans une transaction).

Quelques points à faire attention à ce que:

  • sQLPLUS a un paramètre d'autocommande. Il est désactivé par défaut dans les versions modernes, mais juste pour vous assurer:

    SQL> show autocommit
    autocommit OFF
    

    Si cela se trouve être sur:

    SQL> set autocommit off
    
  • sQLPLUS s'engage à la sortie par défaut même dans les versions modernes. Désactiver cela:

    SQL> set exitcommit off
    

    (C'est assez nouveau, est apparu dans 11g ou 11gr2. Auparavant toujours commis à la sortie.)

  • DDL s'engage. (Deux fois. Une fois auparavant, une fois après.) Notez que truncate est DDL à Oracle.

Outre ces gotchas, vous êtes déjà dans une transaction lorsque vous démarrez SQLPlus et que vous pouvez commettre ou retourner comme vous s'il vous plaît.

$ sqlplus mat

SQL*Plus: Release 12.1.0.2.0 Production on Mon Oct 20 19:51:31 2014
...
SQL> insert into abc values (1) ;

1 row created.

SQL> select count(*) from abc;

  COUNT(*)
----------
         1

SQL> rollback;

Rollback complete.

SQL> select count(*) from abc;

  COUNT(*)
----------
         0

Vous devez utiliser begin/end Lorsque vous souhaitez exécuter un bloc PL/SQL. (Le formulaire de ligne courte/unique pour cet être exec.)

5
Mat

La réponse

Vous êtes déjà dans une transaction. Vous ne pouvez pas vraiment être en dehors d'une transaction de toute façon.

ce n'est pas vrai. Par défaut, une transaction Oracle commence au premier DML (insertion/mise à jour/Suppression) et se termine par commit/Rollback. Vous pouvez démarrer une transaction manuellement, avec la commande Set Transaction , mais la plupart des gens ne le font pas.

Quant à une réponse plus claire entre PG et Oracle:

À Postgres, Commencez à PG de démarrer une transaction (sinon elle est en commission automatique). La transaction se termine bien sûr sur COMMIT/ROLLBACK.

Dans Oracle, commencer (ou déclarer) est le début d'un bloc PL/SQL . Le bloc se termine avec la fin; Mot-clé suivi d'une ligne suivante pour indiquer SQL * Plus d'exécuter le bloc. Le bloc et la transaction sont complètement séparés - vous pourriez être dans une transaction avant d'exécuter le bloc ou que le bloc pourrait démarrer une transaction en émettant des DML.

À Oracle, si vous n'êtes pas dans une transaction, un commit/retour est essentiellement un non-OP. Vous pouvez dire si vous êtes dans une transaction par

SELECT count(*)
  FROM v$session v
  WHERE v.AUDSID = sys_context('userenv','sessionid')
    AND v.TADDR IS NOT NULL;

Vous obtiendrez 1 si vous êtes dans une transaction, 0 sinon.

2
djb