9. Статистикалық SQL


Стантистикалық SQL дәстүрлі программалу тілдеріне препроцессорлы өңдеу түрінде тізбектеледі.

SQL операторлар прекомпиляторлармен өңделеді.

SQL операторларда қолданбалы программа айнымалылары қолданылады.

Операторлар:

DECLARE CURSOR сұратуды анықтайды;

OPEN немесе CLOSE – өңдеу процесін бастайды және анықтайды.

Стаистикалық SQL ққолдану мысалын көрсетейік:

main()

// қателерді өңдеу құрылымын қосу

{ EXEC SQL INCLUDE SQLCA;

// хост-айнымалыларды хабарлау

// (байланыстар және INTO-айнымалылар)

EXEC SQL BEGIN DECLARE SECTION;

int NumIndID;

int NumID; // бұл айнымалылар

//: символынан кейін көрсетіледі

char Sal[10];

EXEC SQL END DECLARE SECTION;

// Қатені өңдеу

EXEC SQL WHENEVER SQLERROR GOTO err_1;

EXEC SQL WHENEVER NOT FOUND GOTO err_2;

// параметрлерді сұрату

printf ("Type individual number: ");

scanf("%d",&NumIndID);

// SQL сұратуды орындау

EXEC SQL SELECT NumID, Sal FROM tbl1

WHERE NumIndID =: NumIndID

INTO :NumID, :Sal;

// нәтижені бейнелеу

std::cout<< "Number: "<<NumID;

exit(0);

err_1:

std::cout<<'' SQLERROR'';

exit(1);

err_2:

std::cout<<'' NOT FOUND";

exit(1); }

Деректер типі әр ДҚБЖ үшін түрленеді.

ДҚБЖ арнайы айнымалдылар арқылы қателер туралы мәліметтерді қайтарады: SQL Communication AREA (SQLCA) құрылымын, SQLSTATE немес SQLCODE айнымалысын.

Ішкі SQL тілінің синтаксисін тереңірек қарастырайық.

Программалық өнім деректер қорына жүгінудің төрт нұсқасы бар:

  • Қандайда бір программалау тіліне SQL-операторларды тізбектеі (статистикалық SQL);
  • Программаны орындау процесінде қандайда бір программалу тілінде SQL-операторларды құрастыру және ары қарай оның орындалуы (динамикалық SQL);
  • Басқа программалау тілінде жазыдлған программалардан SQL тілінде жазылған кодтан тұратын SQL-модульдерді шақыру;
  • Берілген функциялар жиыны арқылы деректер қорымен жұмыс істеуге мүмкіндік беретін API (Application Programming Interface) пайдалану. API коммерциялық ДҚБЖ осы деректер қорымен жұмыс істеуге арналған мақсатты ұсынылған өнімі болуы мүмкін, әртүрлі өндірушілердің ДҚБЖ қолжетім жеке құралдарын жүзеге асырады. Сонымен қатар API-ға ODBC (Open DataBase Connectivity) және SQL/CLI (SQL Call Level Interface) жатады.

Негізгі программа

Негізгі программа немесе HOST-программа деп SQL-операторлар тізбектелетін программа аталады.

SQL-92 стандартында SQL-операторларды келесі программалау тілдеріне тізбектеу мүмкіндігі қарастырылған: C, Pascal, Java (SQLJ), Ada, Cobol, Fortran, PL/1, M.

Ішкі SQL операторлары бар программа орындалу процесі келесі схемада көрсетілген.

Сурет. 9.1.Ішкі SQL операторлары бар программа орындалу процесі.

Бірінші кехеңде негізгі код прекомпилятормен, кейде препроцессор деп аталады, өңделеді. Интеграцияланған программалау орталары құрамында ішкі SQL арналған проекомпиляторлар бар. Прекомпилятор әрекетінің нәтижесінде ішкі SQL операторлары алмастырылады және жаңа қолжетім модулі құрылады. Сонан кейін компиляция мен линкованиядан кейін орындаушы код құралады. Байланыс кезеңінде қолжетім модулін өңдеу жүреді және оған кіретін SQL операторлар үшін орындау жоспары құрастырылады. Компиляциялау кезеңінде орындау жоспарын құру статистикалық ішкі SQL –ді динамикалық SQL –дан айырып береді.

Соынмен SQL операторының орындалуы ақырындап сыртқы процедураны шақырумен алмастырылды, кейін ол ДҚБЖ кітапханасымен байланыстырылды. Сондықтан орындау кезеңінде кітапханалық шақырулар ДҚБЖ тура жіберіледі.

Ішкі SQL бар программа орындалу кезінде орндаушы файлды құрған иесі мен орындаушы қолданушының құқықтары бірдей. Қазіргі коммерциялық ДҚБЖ EXECUTE привелегиясын орнату мүмкіндігі бар, ол модульды орынджау барысында оның иесінің привелегияларын қолдануға болатындығын білдіреді.

Ішкі SQL айнымалылары

Ішкі SQL –да негізгі программалау тілінің айнымалыларын қолдануға болады. Олар

  • өрнектерде
  • INTO-айнымалылар ретінде
  • байланыс айнымалылар ретінде (bind-айнымалылар);
  • Индикаторлы айнымалылар ретінде.

Негізгі программалау тілінің айнымалыларын көрсеткен кезде SQL –операторының кодында бұл айнымалының алдында қос нүкте символын қоямыз.

Осындай айнымалыны қолданбастан бұрын, SQL айнымалылар хабарлау бөлімінде көрсетілуі қажет. SQL –айнымалыларды хабарлау қос операторлардың арасында EXEC SQL BEGIN DECLARE SECTION және EXEC SQL END DECLARE SECTION көрсетілдеді.

Негізгі программада хабарланған айнымалылары бар бөлімдердің еркін саны көрсетілуі мүмкін, бірақ олар тек қана негізгі тіл синтаксисі айнымалыларды хабарлауға мүмкіндік беретін жерлерде ғана көрсетіледі. EXEC SQL BEGIN DECLARE SECTION және EXEC SQL END DECLARE SECTION операторларының ішінде айнымалыларды хабарлау синтаксисі SQL-операторлар тізбекутелетін программалау тіліне сәйкеседі.

Мысалы:

// С++ тілінде айнымалыларды хабарлау коды:

EXEC SQL BEGIN DECLARE SECTION;

int var1;

int var2;

char var3[10];

EXEC SQL END DECLARE SECTION;

// Pascal тілінде айнымалыларды хабарлау коды:

EXEC SQL BEGIN DECLARE SECTION;

var;

var1: integer;

var2: integer;

var3: array (1..10) of char;

EXEC SQL END DECLARE SECTION;

INTO- айнымалыларда қолдану

INTO-айнымалылар негізгі программалау тілінің айнымалыларына нәтижелік жиынынан мәліметтерді шығаруға арналған. Құралда деректер қорына қолжетімнің қандай технологиясы қолданса да, нәтижелік жиында құрғаннан кейін деректер алдағы өңделу үшін ылғи да негізгі программалау тілінің айнымалыларына шығарылуы қажет. Ішкі SQL-де SELECT операторы сұратулар нәтижесі көрсетілетін айнымалыны дереу көрсете алады. Мұндай айнымалалар INTO-айнымалылар деп аталады.

INTO-айнымалыларды қолдану үшін келесі шектеулер қолданылады:

  • Нәтижелік жиын тек қана бір жолды қайтару қажет;
  • әр INTO-айнымалының типі мәні аталған айнымалыға жататын баған типіне сәйкес келу қажет.

Нәтижелік жиын келесі жағдайларда ғана жалғыз жолды қайтаруы мүмкін:

  • PRIMARY KEY немесе UNIQUE уникалды болып табылатын өрісті предикатта қолданған жағдайда;
  • өрістер тізімінде агрегациялайтын функциялар болғанда және GROUP BY жазбасы болмағандағы кестелердің барлық мәліметтерін агрегациялау;
  • егер қолданушы кестелердің құрылымы және SELECT операторының синтаксисі қайтарылатын жолды анықтайтын болса.

Мысалы:

EXEC SQL SELECT f1,f2,f3 FROM tbl1

INTO :var1, var2, var3 WHERE f1=1;

INTO-айнымалылар атаулары өріс атауларымен сәйкесуі мүмкін, өйткені олар түрлі идентификаторлар болып табылады, INTO –айнымалылар қос нүктер символымен ерекшеленеді.

Байланыс айнымалылары

Байланыс айнымалалары (bind-айнымалылар) ДҚБЖ мәндерджі жөнелту үшін қолданылады. Бұл айнымалылар WHERE жазбасында шартты анықтау үшін қолданылуы мүмкін, INSERT және DELETE операторларында орнатылған мәндерді анықтау үшін.

Байланыс айнымалылары, сонымен қатар INTO-айнымалылары да қолданбастан бұрын алдын-ала хабарлануы қажет. Байланыс айнымалылары SQL-операторларда көрсетілгенде қос нүкте символымен еселенеді.

Мысалы:

EXEC SQL INSERT INTO tbl2 (f1,f2,f3) VALUES (:f1,:f2,:f3);

Курсорлар

Курсор дегеніміз сұрату орындалған кезде алынатын нәтижелік жиын және онымен байланысты ағымдағы байланыс көрсеткіші. Курсор – бұл жадының қандайда бір аумағымен байланысты обьекті. Анық және анық емес курсорлар болады.

Анық курсордың атауы бар болуы және пайдаланбастан бұрын хабарлануы қажет. Анық емес курсор автоматты түрде құрылады және сұрату операторын компиляцияламастан бұрын қайта ашуға болмайды.

Курсорды хабарлау DECLARE CURSOR операторымен орындалады, FOR жазбасында курсор мәліметтерімен сәйкес сұратуды анықтайды.

Мысалы

EXEC SQL DECLARE c1 CURSOR FOR SELECT f1,f2,f3 FROM tbl1 WHERE f2>100;

tbl1 кестесінің негізінде c1 курсорын құрады. Курсорды хабарлаған кезде сұрату орындалмайды. Сұратудың орындлуы мен курсор құрылуы OPEN CURSOR операторымен көрсетіледі.

Мысалы

EXEC SQL OPEN CURSOR с1;

Анықталғана SELECT операторын орындап курсор құрастырады.

Құрал курсор мәліметтеріне нәтижелік жиынның жолдарын тізбектеп шығарғанда қолжетім мүмкіндігі пайда болады.

Курсордан мәліметтерді алу үшін FETCH операторы қолданылады.

Мысалы

EXEC SQL FETCH c1 INTO :f1,:f2,:f3;

Курсордың ағымдағы жолының мәнін INTO-айнымалыға шығарады.

Курсорға бөлінген жадыны босату үшін CLOSE CURSOR операторын пайдаланып жабуға болады.

Мысалы:

EXEC SQL CLOSE CURSOR с1;

NULL-мәндерді өңдеу

NULL-мәндермен жұмыс істеу үшін индикаторлы айнымалылар қарастырылған:

  • шығарылатын NULL-мәнді қайтару;
  • кестеге NULL-мәнін енгізу;
  • өткізілген жолдарды бекіту.

Егер FETCH немес SELECT операторының орындалу нәтижесінде алынатын мәліметтер NULL мәнін қабылдайтын болса, онда біріншіден SQL-оператор қатемен орындалған деп есептеледі, екіншіден INTO-айнымалыға NULL өзге мәндер жазылады. Мұндай жағдайлардың алдын алу үшін INTO-айнымалылардан кейін қос нүкте символы (немесе INDICATOR:) арқылы берілетін индикаторлы айнымалылар қолданылады. Егер индикаторлы айнымалы кері мәнге ие болатын болса, онда бағанда NULL мәні бар. Ағым бойынша оператор орындалмастан бұрын индикаторлы айнымалыға 0 мәні меншіктеледі.

Мысалы:

Егер INSERT немес UPDATE операторларының қолданыстағы байланыс айнымалысы NULL мәніне ие болса, онда бұл айнымалалардан кейін қос нүктер арқылы индикаторлы айнымалы жазу қажет. Бұл жағдайда индикатолы айнымаланаң кері мәнінде деректер қорына NULL мәні енгізіледі.

Өткізілген жолдарды бекіткен кезде индикаторлы айнымалыға бастапқа жол ұзындығы жазылады, ал жолдың өзі негізгі тіл айнымалыларына жазылады.

Позицияланған операторлар

Курсорды жаңарту үшін DELETE және UPDATE операторларында әрекет курсордың ағымдағы жолына жататындығын анықтайтынWHERE CURRENT OF жазбасы пайдалауы мүмкін. Мұндай оператор позицияланған деп аталады, және оған келесі талаптар қойылады:

  • курсорда, оператор да бір кестені қолдануы қажет;
  • Курсорды пайдалануға арналған сұратуда UNION жәнеORDER BY жазбалары болмауы қажет ;
  • курсор жаңартушы курсор қағидаларын қанағаттандыру қажет ( мысалы, агрегациялаушы функцияны қолданбау қажет).

Мысалы:

EXEC SQL DECLARE c1 CURSOR FOR SELECT f1,f2 FROM tbl1;

EXEC SQL OPEN CURSOR c1;

EXEC SQL FETCH c1 INTO :f1,:f2;

EXEC SQL UPDATE tbl1 SET f2=f2*1.3

WHERE CURRENT OF c1;

Позицияланған оператор DELETE алдын ала курсормен таңдалған кесте жолдарын өшіруге ыңғайлы.

Қателерді өңдеу

SQL-92 стандартымен екі айнымалы анықталған, орындалушы SQL-оператор туралы мәліметті алуға мүмкіндік береді:

  • SQLSTATE айнымалысы char(5) типіне ие және класс және ішкі класс туралы мәліметке ие ;
  • SQLCODE айнымалысы бүтінмәнді типке ие, және соңғы орындалған SQL-оператор аяқталу кодына ие.

Ішкі SQL қоданылатын басқа да айнымалылар сияқты SQLSTATE және SQLCODE айнымалылары алдынал хабарлануы қажет. Бірақ SQLCODE айнымалысы хабарламаған болса, үнсідік заңы бойын өзі хабарланады.

SQL-оператор орындалғаннан кейін орындалу коды мен статусы туралы мәліметтер автоматты түрде ДҚБЖ жазылады.

SQL-оператордың орындалу статусы:

  • Нәтижелі аяқталу. SQLSTATE '00000' кодына сәйкес келеді (класс '00'). Бұл жағдайда SQLCODE 0-ге тең;
  • Ескертуі бар нәтижелі аяқталу. SQLSTATE '02' күй класы 'NOT FOUND' ескертуін анықтайды, '01' класс күйі ескертуді ішкі класс арқылы көрсетеді;
  • Қатемен аяқталу. '03' класы және SQLSTATE түрлі қателік жағдайларды сипаттайды.

'NOT FOUND' ескертуі SQL-операторда қате болмағандығын, қажет нәтиже қайтармағандығын көрсетеді. Мысалы, құрылған нәтижелік жиында бірде бір жол болмайды немесе UPDATE операторы бірде бір жолды өзгертпеген.

SQLCODE және SQLSTATE айнымалылары while операторында циклды аяқтау үшін және қате болған жағдайда одан шығу үшін жиі қолданылады.

Ішкі SQL WHENEVER операторын қолдайды, аталған жағдай туағн жағдайда орындалатын әркеттерді анықтайды. Бұл операторды сол SQL-операторды орындамастан бұрын көрсету қажет.

WHENEVER операторы барлық орындалатын SQL-операторларға әсер етеді

Мысалы:

EXEC SQL WHENEVER SQLERROR GOTO Err_1;

EXEC SQL WHENEVER NOT FOUND CONTINUE;

EXEC SQL WHENEVER SQLWARNING CONTINUE;

EXEC SQL OPEN CURSOR c1;

EXEC SQL FETCH c1 INTO :f1,:f2,:f3;

:

err_1: std::cout<<'' SQLERROR'';

:

EXEC SQL CLOSE CURSOR c1;

WHENEVER операторы қате туған жағдайда алмасу орнайтын белгіні, не CONTINUE типті әрекетті, не қателерді өңдеу процедурасын анықтайды..

Oracle OCCI-интерфейсі

Ішкі SQL қолданудан басқа, кез-келген программалау тілдерінде деректер қорына қолжетім жеке стандартты механизмін жүзеге асырады, нақты бір деректер қорына және нақты бір програмалау тіліне бағытталған мехнизмдер бар. Осындай мезанизмдердің бірі OCCI-интерфейсі, Oracle ДҚБЖ арналған.

OCCI-интерфейсі (Oracle C++ Call Interface) – бұл API, С++ құралының өндірушісіне Oracle деректер қорына қолжетім мүмкіндігін беретін, деректер қоына қосылу әдістеріне ие, метадеректерді алу әдістері және деректер алу мен өзгерту әдістеріне де ие.

OCCI-интерфейсі орындалушы құралдың жоғары өнімділігін, жадыны пайдалану және желілік әрекетті тиімді пайдалану нәтижесінде, қамтамасыз етеді. Қосымша OCCI-интерфейсі клиент-құралның деректер қоры обьектілеріне қолжетімге мүмкіндік беретін, соынмен қатар копдеңгейлі идентификацияны қоса, қолданушылар идентификациясына мүмкіндік беретін құралдар жиынына ие.

OCCI-интерфейсі динамикалық кітапхана ретінде жүзеге асқан, клиент-құралының орындалу кезінде жүктеледі.

Бұл элементтер SQL немес PL/SQL операторларын негізгі программалау тіліне анық емес тізбектеуге қажет.

Келесі сызбада OCCI –кітапханасын пайдалану арқылы орындалушы құралды алу процесі сызбасы көрсетілген.

Сурет. 9.2.OCCI –кітапханасын пайдалану арқылы орындалушы құралды алу процесі

С++ тіліндегі құрал мысалын көрсетейік, көрсету, мәліметтерді алу, мәліметтерді өзгерту және өшіру жүзеге асыруға OCCI-кітапханасын қолдану.

Мысал:

Қосымша 9.1. (html, txt)