Boşluk, noktalı virgül ve eğik çizgi içeren SQLPlus ile bir komut dosyası yürütme


15

Bazen SQL Developer veya Toad'da iyi çalışacak bir komut dosyası alacağım, ancak SQL * Plus'tan başarıyla çalışabilmek için değişiklik yapılması gerekiyor. Her birinde boş satırlar, noktalı virgül ve eğik çizgi bulunan birden çok ifade içeren en kötü durum örneği:

INSERT INTO t1 VALUES ('a

;
/
');

INSERT INTO t1 VALUES ('b

;
/
');

DELETE FROM t1 WHERE c1 = 'c

;
/
';

Çeşitli nedenlerle bu ifadelerin SQL * Plus'tan çalıştırılması gerekir. Boş satırları basit bir şekilde çözmek kolaydır ...

set sqlblanklines on

Ben sqlterminatordeğiştirilebileceğini ve / veya kapatılabileceğini biliyorum, ama her ikisi de kod üzerinde değişiklikler gerektirecektir, eski sorunu çözmeden sorunu taşır ve ne gömülü eğik çizgi sorunu çözmez.

En iyi cevap, ortamın bir şekilde değiştirilmesiyle (sqlblanklines'ın yaptığı gibi) bu ifadelerin değiştirilmeden çalışmasına izin vermenin bir yolu olacaktır. Bu mümkün değilse, belki de komut dosyalarını programlı olarak değiştirmenin bir yolu vardır. Manuel değişikliklerden kaçınmaya çalışıyorum.


SQLPLUS komut satırı yürütme kullanılırken bu sorun kolayca oluşabilir. SQLPLUS programının içindeyken, komut satırı düzenleyicisi de hala etkindir. Sonuç olarak, komut satırı düzenleyicisi ile ilgili öğeler (boşluklar komut / değişken olarak yorumlanır, noktalı virgüller komutun sonu olarak görülür). Bu nedenle, bir parolada '@' bulunması, oturum açmaya çalıştığınızda kalp ağrısı dışında hiçbir şeye neden olmaz (@ sağındaki her şey bir DB adı olarak görülür). Büyük bir dağıtım sırasında, TOAD aracılığıyla bir şeyler dağıtmaya zorlayan boş alanlarla ilgili sorunlar bulduk. SQLPLUS işe
yaramazdı

Düşünceleriniz için teşekkür ederim. Peki, açıklamak gerekirse cevabım istediğim şeyin imkansız olduğunu mu?
Leigh Riffel

Dize içindeki satır başlarını satırda chr (10) 'un listelendiğine dönüştürebilir misiniz?
Chris Saxon

@ChrisSaxon Yapabilirim, ancak bu sorun kodlanması gereken ve sözdiziminin bir parçası olarak tek başına bırakılması gereken iadelerin nasıl ayırt edileceğidir. Bunu yapmanın bir yolu varsa, lütfen bunu yanıt olarak gönderin.
Leigh Riffel

Yanıtlar:


8

Bunun birçoğunu login.sql kullanarak yapabilirsiniz. login.sql - şaşırtıcı - oturum açma sırasında yürütülür ve SQLPATH veya geçerli dizinden yüklenir. Verdiğiniz örnekler için en kötü durumu gerçekten seçtiniz.

Sorun sqlterminator. Oraya ne koyarsanız koyun, eğik çizgi serbest bir sqlterminator olarak korunur. Bunun yanında, sqlplus ilk olarak sqlterminator'u tarar ve bunu dize sonlandırıcısına taramadan önce yapar. Bana sorarsan bir hata. Eğik çizgi, ayrı bir satırda yalnız olmadığı sürece bir dizede kullanılabilir. Sqlplus sqlterminator olarak belirtilen karakteri bulur bulmaz, diğer her şeyi yok sayar ve okumayı durdurur.

Eğik çizgi, bir hatta yalnız olmadığı sürece ele alınabilir.

login.sql içeriği:

prompt run login.sql
show sqlterminator
show sqlblanklines
set sqlblanklines on
set sqlterminator ';'
show sqlterminator
show sqlblanklines
prompt ready login.sql
set echo on

leigh.sql içeriği:

INSERT INTO t1 VALUES ('fail bc semicolon
a;a
/
'); 

INSERT INTO t1 VALUES ('fail bc solo /


aa
/
');

INSERT INTO t1 VALUES ('ok / not solo


aa
/a
');

DELETE FROM t1 WHERE a = 'c


a/
';

komut dosyasını çalıştırın:

sqlplus leigh/leigh@orcl @leigh
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 9 22:36:20 2012

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

run login.sql
sqlterminator ";" (hex 3b)
sqlblanklines OFF
sqlterminator ";" (hex 3b)
sqlblanklines ON
ready login.sql
SQL> INSERT INTO t1 VALUES ('fail bc semicolon
  2  a;a
  3  /
ERROR:
ORA-01756: quoted string not properly terminated


SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL> 
SQL> INSERT INTO t1 VALUES ('fail bc solo /
  2  
  3  
  4  aa
  5  /
ERROR:
ORA-01756: quoted string not properly terminated


SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL> 
SQL> INSERT INTO t1 VALUES ('ok / not solo
  2  
  3  
  4  aa
  5  /a
  6  ');

1 row created.

SQL> 
SQL> DELETE FROM t1 WHERE a = 'c
  2  
  3  
  4  a/
  5  ';

0 rows deleted.

Başlangıç ​​/ bitiş blokları ile uğraşmanıza gerek yok. Bir dizedeki nerede olursa olsun, sqlterminator komut içinde işlenemiyor ya da olmasın, bir dizedeki bir satırda eğik çizgi bulunan satırları tek başına işleyemez.


1
Kanıt için teşekkür ederim. Ben zaten benzer bir login.sql dosya kurulumu kullanıyorum. Temel olarak bu, neden yapmak istediğimin yapılamayacağını doğrular.
Leigh Riffel

1
küçük bir değişiklik, ayarları yapan ve gerçek komut dosyasını çağıran bir koşucu komut dosyası kullanmaktır. Sqlplus leigh / leigh @ orcl @ runner leigh olur. Login.sql'den biraz daha esnek
ik_zelf

1

BEGIN ... END bloklarının içine yerleştirilirse, boş satır ve noktalı virgül içeren ifadeler başarılı olur. Bu değişiklik bir komut dosyası kullanılarak yapılabilir, ancak komut dosyası hemen yürütmeden bir blok içinde çalıştırılamayan DDL ifadeleri içeriyorsa başarısız olur.

Bu çözüm ayrıca gömülü / sorunu çözmez.


Geçmişte sqlplus önlemek için bunu yapmak için bir perl / DBD komut dosyası kullandım. Mutlu paylaşmak ...
Philᵀᴹ

@Phil Teşekkür ederiz, ancak SQLPlus durumların% 99,9'unda iyi çalışır, bu yüzden karışıma başka bir araç eklememeyi tercih ederim.
Leigh Riffel

1

Geçici çözümüm:

         begin
             INSERT INTO t1 VALUES ('a

             ;
             ');
         end;
         /

Görünüşe göre komut sonlandırıcı gövde ifadesinin içinde yok sayılıyor.


Bunun neden DDL ifadeleri veya gömülü eğik çizgiler için iyi bir çözüm olmadığına ilişkin cevabımı görün.
Leigh Riffel

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.