Oracle
 sql >> база данни >  >> RDS >> Oracle

Наклонена черта или без наклонена черта?

Това е въпросът.

Скорошна публикация във форумите на OTN попита за използването на точки и запетая и наклонени черти като терминатори на изрази. Изтрих една статия, която написах за нашия екип за разработчици преди повече от 4 години по тази тема. Тази статия получи добри отзиви и е достъпна във форумите на OTN, ако желаете. Реших да го публикувам и в блога си. Ето статията:

Наклонена черта или без наклонена черта

от Брайън Пийлънд

В нашата компания SQL скриптовете, които се разгръщат, се изпълняват в помощната програма на Oracle SQL*Plus от командния ред, докато много разработчици използват GUI инструмент като PL/SQL Developer или SQL Developer. Наклонената черта означава нещо за SQL*Plus, което не е необходимо в PL/SQL Developer или SQL Developer. По този начин може да бъде объркващо да разберете дали трябва да включите наклонена черта във вашите SQL скриптове или не. Надяваме се, че този раздел ще хвърли малко светлина върху това какво прави наклонената черта, кога да се използва и кога да не се използва. Терминатор на точка и запетая За повечето SQL изрази точката и запетая е терминаторът на израза. Например, разгледайте този прост SQL израз, изпълняван в SQL*Plus:

SQL> изберете системна дата от двойна;

SYSDATE

———

18-ЮНИ-12

Когато SQL*Plus види точката и запетаята, той знае, че краят на SQL израза е достигнат и вече може да изпълни командата.

SQL*Plus буфер

Може да не сте наясно, че SQL*Plus има буфер за своите команди. Ако натисна клавиша „l“ за „списък“, тогава мога да видя командата, която в момента е в буфера на моята сесия.

SQL> l

1* изберете системна дата от двойна

Не е изненадващо, че има командата, която току-що изпълних. След това изпълних друг SQL оператор и ето как изглежда моят буфер сега:

SQL> l

1 изберете sysdate,user

2* от двойно

Както можете да видите, сега имам два реда в SQL*Plus буфера на моята сесия.

Наклонена черта =Буфер за изпълнение

Първото правило, което трябва да разберете за наклонената черта е, че за SQL*Plus, наклонената черта означава изпълнение на съдържанието на буфера. За да илюстрирам тази концепция, ще изпълня SQL оператор, ще изчакам няколко секунди и след това просто ще изпълня същия SQL оператор отново, но само изпълнявайки буфера.

SQL> изберете to_char(sysdate,’MM/DD/YYYY HH24:MI:SS’) от двойно;

TO_CHAR(SYSDATE,’MM

———————-

18.06.2012 15:20:40

SQL> /
TO_CHAR(SYSDATE,’MM

———————-

18.06.2012 15:21:17

SQL> /

TO_CHAR(SYSDATE,’MM

———————-

18.06.2012 15:21:50

Можете да видите, че всичко, което направих втория и третия път, беше просто да напиша „/“ и да натисна enter и SQL*Plus изпълняваше съдържанието на своя команден буфер всеки път.

PL/SQL блокове

Терминаторът на израза с точка и запетая работеше добре сам, докато Oracle не въведе PL/SQL във версия 7 на Oracle. Проблемът е, че PL/SQL блоковете могат да имат множество точки и запетая, за да прекратят отделните изрази, които съставляват този блок. Помислете за този много прост PL/SQL блок, който не прави нищо:

SQL> начало

2 нула;

3 нула;

4 край;

5

Редове 2 и 3 съдържат напълно валидни изрази, всеки от които завършва с точка и запетая. И в ред 4 имаме ключовата дума END, означаваща края на PL/SQL блока. Ако не ни бяха разрешени вложени двойки BEGIN/END, тогава всеки път, когато SQL*Plus вижда „END;“ ще знае, че краят на блока PL/SQL е достигнат, но ни позволяват вложени двойки BEGIN/END, така че следното е напълно законно и валидно:

SQL> начало

2 започват

3 нула;

4 край;

5 нула;

6 край;

7

Можете да разберете от горното, че просто търсите „КРАЙ;“ не е достатъчно, защото SQL*Plus би се опитал да изпълни блока след ред 4. И така, как Oracle реши да означава, че PL/SQL блокът е готов за изпълнение? Отговорът е чрез използване на наклонена черта, както може би вече сте наясно. Второто правило, което трябва да разберете, е, че цялата наклонена черта прави, когато я използвате за прекратяване на PL/SQL блок, е да кажете на SQL*Plus да изпълни това, което е в буфера! Това не се е променило от преди създаването на PL/SQL за Oracle 7. Помислете за следната извадка:

SQL> начало

2 нула;

3 край;

4 /

PL/SQL процедурата е завършена успешно.

SQL> l

1 начало
2 нула;

3* край;

На ред 4 написах наклонената черта, за да изпълня блока PL/SQL. Можете да видите, че моят блок е завършен успешно. Ако се върнем назад и погледнем съдържанието на моя команден буфер, можете да видите, че съдържа всичко освен наклонената черта. Наклонената черта не е част от командния буфер. Така че сега ще стартирам различен PL/SQL блок:

SQL> начало

2 dbms_output.put_line(‘Днес е ‘||to_char(sysdate,’MM/DD/YYYY HH24:MI:SS’));

3 край;

4 /

Днес е 18.06.2012 15:39:32

PL/SQL процедурата е завършена успешно.

Наклонената черта каза на SQL*Plus да изпълни това, което е в неговия буфер, и резултатите се показват. Сега нека напишем отново наклонената черта и трябва да видим, че нашият PL/SQL блок се изпълнява отново.

SQL> /

Днес е 18.06.2012 15:40:42

PL/SQL процедурата е завършена успешно.

Не се наложи да въвеждам отново своя PL/SQL блок, тъй като в момента е в командния буфер.

PL/SQL и SQL Developer и PL/SQL блокове

Най-големият проблем за повечето разработчици е, че PL/SQL Developer и SQL Developer не изискват да използвате наклонена черта. Защо? Защото можете да натиснете Execute (F8) или Run Script (F5), за да стартирате вашия PL/SQL блок. PL/SQL Developer знае, че в момента, в който натиснете F8, възнамерявате да изпратите PL/SQL блока за изпълнение. В този случай F8 в PL/SQL Developer върши същата работа като наклонената черта в SQL*Plus. По същия начин за F5 в SQL Developer.

Проблемът в моята компания е, че нашият екип, който внедрява код в производството, не внедрява код с PL/SQL Developer или SQL Developer. Те използват SQL*Plus, защото скриптирането на множество изпълнения е по-лесно с инструмент за команден ред. Много разработчици правят грешката да не включват наклонената черта за PL/SQL блокове в скриптове, защото не се нуждаят от нея, но ако искате да разгърнете този кодов раздел в SQL скрипт, наклонената черта е необходима в края на всеки PL /SQL блок.

Кога да не се използва наклонена черта

И така, видяхме кога и защо използваме наклонената черта, но кога е лошо да я използваме? Третото правило, което трябва да знаете, е, че е лошо да се използва наклонената черта след единичен SQL оператор (не в PL/SQL блок), особено когато тази наклонена черта следва непосредствено след DML израз (INSERT, UPDATE или DELETE). Ако моят скрипт съдържа следното:

изберете системна дата от двойна;

/

Тогава ще получа „двоен изход“, което не е това, което обикновено възнамерявам да правя в скрипт. Наистина искам да се върне само един ред, а не два, както би направил горният скрипт:

SQL> изберете системна дата от двойна;

SYSDATE

———

18-ЮНИ-12
SQL> /

SYSDATE

———

18-ЮНИ-12

Още по-лошо е, когато използвам наклонената черта след DML оператор, защото този израз ще бъде изпълнен два пъти. Помислете за следния скрипт:

вмъкване в стойности на test_tab (10);

/

Вече знаем, че когато изпълня двата реда по-горе в скрипт, SQL*Plus ще го изпълни веднъж поради терминатора на израза с точка и запетая и след това ще изпълни втори път, защото наклонената черта казва на SQL*Plus да изпълни това, което е в команден буфер. Когато изпълня двуредовия скрипт по-горе, получавам следния изход:

SQL> вмъкнете в стойностите на test_tab (10);

Създаден е 1 ред.

SQL>

/

вмъкнете в стойностите на test_tab (10) *

ГРЕШКА на ред 1:ORA-00001:уникално ограничение (PEASLAND.SYS_C00767176) е нарушено

Опа! Първото вмъкване работи (създаде 1 ред.), но когато беше въведена наклонената черта, SQL*Plus се опита да вмъкне същите данни и бях хванат за уникално нарушение на ограничението.

Заключение

Надяваме се, че тази страница показва защо е необходима наклонената черта, какво прави и кога да не се използва. За да обобщим:

  • Включете наклонената черта в края на всеки PL/SQL блок
  • Не включвайте наклонената черта след SQL изрази, които не са в PL/SQL блок.
  • Наклонената черта след единичен SQL израз ще накара тази SQL команда да се изпълни два пъти.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Набор за тестове за настройка на AOL/J

  2. AUTONOMOUS_TRANSACTION

  3. Как да създадете PL/SQL съхранени процедури без параметри в базата данни на Oracle

  4. Oracle Изтриване на редове, съвпадение на множество стойности

  5. колоната не е позволена тук грешка в израза INSERT