Стантистикалық 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 тілінің синтаксисін тереңірек қарастырайық.
Программалық өнім деректер қорына жүгінудің төрт нұсқасы бар:
Негізгі программа
Негізгі программа немесе 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 –да негізгі программалау тілінің айнымалыларын қолдануға болады. Олар
Негізгі программалау тілінің айнымалыларын көрсеткен кезде 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-айнымалыларды қолдану үшін келесі шектеулер қолданылады:
Нәтижелік жиын келесі жағдайларда ғана жалғыз жолды қайтаруы мүмкін:
Мысалы:
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-мәндермен жұмыс істеу үшін индикаторлы айнымалылар қарастырылған:
Егер FETCH немес SELECT операторының орындалу нәтижесінде алынатын мәліметтер NULL мәнін қабылдайтын болса, онда біріншіден SQL-оператор қатемен орындалған деп есептеледі, екіншіден INTO-айнымалыға NULL өзге мәндер жазылады. Мұндай жағдайлардың алдын алу үшін INTO-айнымалылардан кейін қос нүкте символы (немесе INDICATOR:) арқылы берілетін индикаторлы айнымалылар қолданылады. Егер индикаторлы айнымалы кері мәнге ие болатын болса, онда бағанда NULL мәні бар. Ағым бойынша оператор орындалмастан бұрын индикаторлы айнымалыға 0 мәні меншіктеледі.
Мысалы:
Егер INSERT немес UPDATE операторларының қолданыстағы байланыс айнымалысы NULL мәніне ие болса, онда бұл айнымалалардан кейін қос нүктер арқылы индикаторлы айнымалы жазу қажет. Бұл жағдайда индикатолы айнымаланаң кері мәнінде деректер қорына NULL мәні енгізіледі.
Өткізілген жолдарды бекіткен кезде индикаторлы айнымалыға бастапқа жол ұзындығы жазылады, ал жолдың өзі негізгі тіл айнымалыларына жазылады.
Курсорды жаңарту үшін DELETE және UPDATE операторларында әрекет курсордың ағымдағы жолына жататындығын анықтайтынWHERE CURRENT OF жазбасы пайдалауы мүмкін. Мұндай оператор позицияланған деп аталады, және оған келесі талаптар қойылады:
Мысалы:
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-оператор туралы мәліметті алуға мүмкіндік береді:
Ішкі SQL қоданылатын басқа да айнымалылар сияқты SQLSTATE және SQLCODE айнымалылары алдынал хабарлануы қажет. Бірақ SQLCODE айнымалысы хабарламаған болса, үнсідік заңы бойын өзі хабарланады.
SQL-оператор орындалғаннан кейін орындалу коды мен статусы туралы мәліметтер автоматты түрде ДҚБЖ жазылады.
SQL-оператордың орындалу статусы:
'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)