Oracle Client-Server Кеңестері

Новости мира

Oracle кез келген жағдайда керемет, оның ортасына сирек бағдарламашы жетеді — Гоголь
Ібіліс соншалықты қорқынышты емес, ол боялған (Oracle орыс Foxprist үшін қорқынышты емес) Орыс мақалы.

Екі жыл бұрын маған VFP (клиент) -Oracle (сервер) үлкен жобасына қатысуға тура келді. Бұған дейін мен жеке Oracle серверімен ұзақ уақыт ойнасам да, бастапқыда жобаны жүзеге асырудағы әрбір қадамымызды алу қиынға соқты және ол кішігірім жеңіс деп саналды. Осыдан кейін мен басқа клиенттер үшін тағы бір жобаны жасауға тура келді. Уақыт өте келе бұл жеңістердің бәрі ештеңені білдірмейтін сияқты. Бірақ бұл тозған заттар біреуге қажет болуы мүмкін. Тағы да атап өтейін, мұнда білгірлер оқитын ештеңе жоқ. Ақпарат негізінен жаңадан бастаушыларға арналған.
Oracle серверіне жіберілген пәрмен сізге қате берсе, оны Oracle SQL Interprise парағында тексеріңіз? Ол жаққа бармаса FOX арқылы жібергеннің пайдасы жоқ. Пәрменді жіберу мәселесі FOX-те бірнеше сағат бойы ізделетінін ондаған рет көрмесем, мен бұл кеңесті ешқашан бермес едім.

MS SQL серверінен айырмашылығы, Oracle процедурасының шақыруы FOXPRO клиент жағында ешқандай курсорларды жасамайды. Себебі, ол оларды Oracle-дың өзінде шығармайды. Олардың нәтижесі кейде Oracle айнымалыларына қайтарылады. Серверде не өзгергенін білу үшін серверге сәйкес SQL таңдау командасын жіберіңіз.Айтпақшы, MS SQL серверінен айырмашылығы, мұнда процедураның атын ғана жіберу жеткілікті, Oracle процедурасын шақыру күрделірек және ұқсайды. sqlexec(con,’begin demo.procname; end;’) Кейбір Oracle процедуралары in-out түріндегі Oracle айнымалыларымен жұмыс істейді, яғни процедураға жіберілген айнымалылар сол жерде өзгертіліп, өзгертілген мән процедурадан қайтарылады. Егер сіз процедураға мәндерді тапсырсаңыз, оның көмегімен клиент тарапынан ешқандай шығын болмайды, мысалы, сұрақ белгісі арқылы, клиентте олардың өзгертілген мәндерін алу өте қиын. Мысалы
m.var=’бірінші мән’
sqlexec(con,’declare vr=?m.var begin demo.procname(vr) ; end ; қостан vr таңдаңыз;’)
Айнымалы пәрменнің екінші бөлігімен пайда болған курсордағы FOX жүйесінде бізге оралады. Тек сонда ғана алуға болады.
Барлық Oracle нысандары – кестелер, процедуралар, триггерлер, функциялар сол жерде схемалар деп аталатындар ішінде тұрады. Схема осы нысандарды Orakl-ға әкелген пайдаланушының атына сәйкес келеді. Әртүрлі атаулары бар пайдаланушылар клиент жағында жұмыс істей алатындықтан, бұл нысандарға қатынас схема атауын қамтуы керек. Мысалы [sqlexec(con,’select demo.tr() from dual’)],
Oracle жүйесінде SQL операторын кесте атауынсыз шақыру мүмкін болмағандықтан және Oracle шақыруында мұндай функциялар болмауы мүмкін болғандықтан, жоқ кестенің атауы қос операторға ауыстырылады.
sqlexec(con,’dual ішінен sysdate таңдаңыз’) Жүйе күнімен FOX жүйесінде курсорды шығарады.
Мысал – функцияны шақыру
Sqlexec(con,’dual ішінен rtval ретінде demo.func(1) таңдаңыз’)
Көбінесе бірдей нысандар Oracle-ға әртүрлі схемаларда жеткізіледі, біреуі әлі дайын емес бағдарламаны сынау үшін, басқалары жауынгерлік жұмыс үшін. Бұл жағдайда біз схема атауын FOX config.fpw файлына қойып, сервер пәрмендерін шақырған кезде оны Fox-та ауыстыра аламыз.
m.sql=’ ‘+schema+tablename (өріс атаулары) мәндерін (мәндерін) кірістіру FOX кәсіби нұсқаулығында кеңестер бар — Fox кестелерінде клиенттік қосымшаны жасаңыз, оларда жергілікті көріністер жасаңыз, қолданбаны жөндеу, содан кейін үлкейтуді пайдаланыңыз. кестелерді серверге және жергілікті көріністерді қашықтағыларға импорттау шебері. Менің көзқарасым бойынша, бұл ақ бұқа туралы ертегі, кестелерді, әрине, Oracle-ге апаруға болады, бірақ бәрі өте баяу жұмыс істейді және көптеген мәселелерді мүлдем шешу мүмкін емес. Оны өзіңіз тексеріңіз. Orakl-да қашықтағы өкілдік пен оның sqlexec арқылы тікелей шақыруын жасаңыз, орындалу уақытын өлшеңіз — үлкен айырмашылық. Түлкіні ортақ қосылыммен жұмыс істеу үшін конфигурациялауды ұмытпаңыз, әйтпесе кез келген қашықтағы көрініс өз қосылымын шақырады және олардың барлығы босқа кетеді.
Oracle сервері (сатып алынған немесе ұрланған) әдетте сатып алған жағдайда оның бағасына тікелей әсер ететін қосылымдардың белгілі бір санына арналған. Ал пайдаланушылар көбірек отырғызғысы келеді. Сондықтан біз сияқты кедей және дамымаған орыстар байланыс үшін күресуі керек. Қарапайым бақылау көптеген пайдаланушы интерфейстерінде адамдар деректерді енгізіп, өңдейтінін және оған көп уақыт жұмсайтынын көрсетеді. Олардың қосылымын басқа клиенттер серверден кез келген нәрсені жіберу немесе алу үшін пайдалана алады. Жалпы, қосылымдарды қажетсіз ашық ұстауға болмайды. Шектеулі қосылымдар санымен жұмыс істегенде және қажет емес кезде жабу кезінде, оларды сұрағанда, қазіргі уақытта байланыс жоқ деген жағдайды қамтамасыз ету керек және оны күту керек.
sqlsetprop(0,’DispLogin’,3)
орындаңыз while sqlconnect(‘poracle’,’username’,’userpassword’) aerror(қате)
қате болса[1]=1526 және қате[4]=8008! қосылуды біраз уақыт күтуде
эндиф
enddo
Кейде Oracle пәрменіне немесе процедурасына қоңырау ұзақ уақыт алуы мүмкін. Бұл қосылымды жабу мүмкін емес. Сондықтан бұл кеңес. Бұл жағдайда арнайы, ұзақ мерзімді жабылмайтын байланыс жасаңыз. Мен білетін адамдар мұны бір жарым байланыс стратегиясы деп атайды. Бір байланыс бар, екіншісі бар, ол жоқ. Бұл дефокус асинхронды пәрмен шақырылғанда орындалады. Синхронды хаттаманың үстінен қысқа команда жібереміз, нәтиже аламыз, ал асинхронды хаттаманың үстінен ұзынды жібереміз, одан нәтиже бар-жоғын мезгіл-мезгіл тексереміз. .
Кез келген дерекқор үшін бастапқы кілт мәндерін тағайындау міндеті бар. Oracle-да осы және басқа мақсаттар үшін бастапқы мәні мен өсімі бар арнайы реттілік нысаны бар. Негізгі мәнді тағайындау және оны анықтау, мысалы, еншілес кестеде тағайындау туралы ойға бірінші келетін нәрсе келесідей код болып табылады.
sqlexec(con,’ schemaname.tablename (бастапқы файл атауы, ..) мәндеріне кірістіру (schemaname.seqtablename.nextval,…)’)
sqlexec(con,’схема атын таңдаңыз. Seqtablename.curval қосарлыдан lstval ретінде’).
Бірақ содан кейін жазбаларды қосу кезінде барлық кестелер үшін кез келген командадағы тізбектердің мәнін есте сақтау керек. Сервермен жұмыс істеудің сынып кітапханасында орналастырылған кестенің аты бойынша реттілік атын анықтау үшін, ең болмағанда, жаңа жазбаларды қосқанда, сізге алаңдамау үшін қандай да бір автомат қажет. кілттерді тағайындау. Сонымен қатар, клиенттегі кілтті есептеу және оны серверге қайта жіберу өте ғылыми емес. Сіз мұны басқаша жасай аласыз, кестелер арқылы өтетін фоксқа процедураны жаза аласыз, олардың әрқайсысы үшін реттілік пен оған сілтеме жасайтын кірістіру триггерін жасай аласыз, ол серверде жазба қосылған кезде кілтті автоматты түрде тағайындайды. Оны қайтару ғана қалды.
Триггер ұқсас болуы мүмкін
орындалу нөмірін жариялау; DEMO таңдауды бастаңыз. seqtablename.nextval ішіне
dual -дан runval ; :new.CUSTOMER_ID:=runval ; lstkey ішіне енгізіңіз
(tbname,lstval,ses_id) мәндері (tbname,runval, userenv(sessionid));
Соңы ;
Жаңа жазбаны жасағаннан кейін негізгі мәнді таңдаулы DEMO ретінде табуға болады. seqtablename.curval from dual Және сіз мұны басқаша жасай аласыз Тағайындалған кілт мәнін арнайы кестеде сақтауға болады (біз оны триггерде жасаймыз), біз оны FOX бағдарламасында орындаймыз. Тек кімнің кілті қай клиентке тиесілі екенін белгілеу керек. Ол үшін Oracle айнымалы мәнін пайдалануға болады — Oracle-да бұл үшін сеанс айнымалысы бар, ол әр қосылым үшін бірегей, тіпті бірнеше пайдаланушылар бірдей атпен кірген болса да. Және ол userenv(sessionid) функциясынан танылады
Oracle көптеген серверлер мен дерекқор тілдерінде жетіспейтін бір керемет нәрсе бар. Реттелмеген жазбалары бар кесте бар делік, олардың көп саны бар. Мен жазбалардың шектеулі санымен нәтиже алғым келеді, бірақ тапсырыс берді.
Деректер алдымен шағын үлгіде реттелуі керек, содан кейін ғана алғашқы 100 жазба емес, алғашқы 100 реттелген жазба қайтарылады, дейді клиенттер алфавит бойынша. Өйткені, Алексеев он миллионыншы болуы мүмкін.
Міне, Oraklu үшін жазбалардың физикалық реті бойынша емес, сізде болатын индекс бойынша маған skazat-таңдауға болады. Жетіспейтін жалғыз нәрсе — жазбалар санын шектейтін нәрсе. Айта кету керек, сервер әзірлеушілері бұл жерде сирек «логикалық» болып табылады.Нұсқаулықтың бірінші бетінен соңғы бетіне дейін олар серверлерде рекордтық сан деген түсінік жоқ деп біздің миымызға балғамен ұрады. Бірақ олардың өздері фактіден кейін осы санға ұқсас нәрсені (немесе тіпті бірнеше айнымалыларды) енгізуге шексіз сүрінді. Oracle ерекшелік емес — rownum жазбалар санын шектейді.
m.sql=m.sql+» ТАҢДАУ DISTINCT «
m.sql=m.sql+» /*INDEX(IND_NUM) */»
m.sql=m.sql+schema+»tick.NUM «+схема+»белгі «
m.sql=m.sql+» WHERE rownum /* INDEX(TICK IND_NUM) */ — мұнда серверге кесте емес, тапсырыс беру үшін индексті пайдалану керектігін айтатын Oracle кеңесі берілген. Олар нөмірді бергісі келмейді. Бірақ шайтан, оны қалай еске алсаң да, бәрібір шығады.
Сыртқы біріктіруді қалай жасауға болады, яғни олардың арасында әрқашан сәйкестік болмаған кезде кестелерді байланыстыру
demo.goodsln, demo.goods сайтынан gdname ретінде nvl(gdname,’ ‘) таңдаңыз Мұнда goodsln.gd_id=goods.gd_id(+)
Плюс бар кесте сілтемесі әрдайым бола бермейтін сілтеме сияқты, бірақ ол жерде көмектесетін сілтеме бар-жоғына қарамастан негізгі кестенің барлық жазбаларын қайтару керек.
Ұнаса да, қаламасаңыз да, оны бірегей түрде анықтайтын рекордтық нөмір қажет болғанда тағы бір қарапайым мысал. Деректерді бір өрістен екінші өріске, бірақ әрбір жазбада сүйреп апару ниеті бар. Циклды жазбаларға бөлу жақсы идея емес. Ал, «rowid» айнымалысын қолданайық. Жаңарту оны «көтерме» етіп жұмыс істейтін болады.
sqlexec(con,’update demo.table set fielda=(tablo.rowid=tb1.rowid demo.table tb1 ішінен өрісb таңдаңыз)’)
Мұнда тек Oracle ғана емес, барлық серверлер үшін маңызды сұрақ бар. Мен мұны бір немесе басқа түрде жиі сұрайды. Міне, жауап
Fox-та сервер транзакцияларын басқарудың екі режимі бар — айқын және жасырын. Сіз оларды араластыра алмайсыз — сіз біртүрлі нәтижелерге қол жеткізесіз. Егер сізде sqlprop(‘transaction’,1) болса — әрбір пәрмен автоматты түрде орындалады, егер сіз sqlexec(con,’begin transaction’) өзіңіз sqlexec(con,’Commit’) деп жазбасаңыз.
Бірақ сізде sqlprop(‘transaction’,2) болса, транзакцияны аяқтау үшін sqlcommit(con) жазу керек.
«транзакцияны бастау» және sqlexec(con,’Commit’) мұндай орнату ішінде жазылмауы керек.
Oracle-да сіз есте сақтамайтын көптеген функциялар мен пәрмендер бар, сондықтан олардың қоңырауларын Fox кітапханасының сәйкес әдістеріне тасымалдауға уақыт бөліңіз. Уақытты үнемдеу.
FOX-пен бірге келетін мысалдардың ішінде тізілімге кіретін сынып бар (registry.prg ), атап айтқанда, ODBS атымен ол қай серверді білдіретінін біле алады және оны филиалдарды жазу үшін пайдалана алады.
серверге сезімтал код.
Orakl сұрауларының жылдам жұмыс істеуін қаласаңыз, олардың айнымалылары үшін индекстер жасаңыз. Үлкен үлгілерде айырмашылық жүздеген есе. Бұл туралы бәрі біледі, бірақ бәрі бірдей жасай бермейді.
Жарайды, бұл кеңес емес, алаяқтық сияқты хакерлердің айласы.
Біз қашықтағы көріністі жаңартуға болатынын білеміз, бірақ sqlexec нәтижелері жоқ және өңделген деректерді серверге өзіміз тасымалдау керек. Бірақ екінші әдіс жылдамырақ жұмыс істейді және үлкен істер үшін қолайлы. Жылқы мен дірілдеген қанжығаны бірге кесіп өтуге болады екен, Oracle-да қашықтан көрініс жасап, оны жаңартылатын етіп жасайық. Деректер базасында gendbc процедурасын іске қосып, көріністі анықтағаннан кейін барлық кодты шығарып алайық. Енді серверге қарау сұранысымен sqlexec пәрменін жіберейік, оны Fox жағында алған кезде кодтан жұлып алған бөлікті іске қосамыз.Енді курсордағы бір нәрсені өзгертейік. Қазір серверді қараңыз — біздің өзгертулеріміз командаларсыз және өрістерсіз !!!!