ãã®ã¬ãã¥ãŒã¯ç¶²çŸ çãªãã®ã§ã¯ãªããPostgreSQLã§ã®äœæ¥ãéå§ããOracleéçºè ã«ãšã£ãŠæäœéã®å ¥éæžãšèŠãªãã¹ãã§ãã
ããã§ãæãéèŠãªãã®ãšããŠèªèããçžéç¹ã®ãªã¹ãã次ã«ç€ºããŸãã
- ããŒãã«ãåãã¹ãã¢ãããã·ãŒãžã£ã®ååã¯ãæ¢å®ã§ã¯å°æåã§ãïŒåŒçšç¬Šã§å²ãŸããèå¥åãé€ãïŒã ããã¯ãSQLã¯ãšãªã®çµæã®ååã«ã圱é¿ããŸãã
- ããã±ãŒãžã¯ãµããŒããããŠããŸããã Solid12ã«ãŒãã«ã¯ãåè·¯ã䜿çšããŠæ©èœãããã±ãŒãžã«ã°ã«ãŒãåãããããããã€ãã®ã³ã¢åè·¯ã䜿çšãããŸãã
- ããã±ãŒãžå€æ°ã®ä»£ããã«ãã»ãã·ã§ã³å€æ°ã䜿çšãããŸãã ãããã®ã»ãã³ãã£ã¯ã¹ã¯äŒŒãŠããŸãããããã€ãã®éãããããŸãã
- PostgreSQLã®äžæããŒãã«ã¯åžžã«ããŒã«ã«ã§ãããOracleãšã¯ç°ãªããã¹ããŒãã«ãã€ã³ãã§ããŸããã Solid12ã«ã¯ãOracleã¹ã¿ã€ã«ã®ã°ããŒãã«äžæããŒãã«ããšãã¥ã¬ãŒãããæ©èœã»ããããããã°ããŒãã«äžæããŒãã«ãæäœããããã®æšæºæ§æãå®å šã«ãµããŒãããŠããŸãã
- PL / PgSQLã¹ãã¢ãããã·ãŒãžã£èšèªã¯äŒŒãŠããŸãããOracle PL / SQLãšã¯å€ãã®è©³çŽ°ãç°ãªããŸãã
- ã¹ãã¢ãããã·ãŒãžã£ã¯åžžã«åçãã€ã³ãã£ã³ã°ã䜿çšããŸãïŒã€ãŸããæåã¯å®è¡æã«è§£éãããŸãïŒã ããšãã°ãã¹ãã¢ãããã·ãŒãžã£ããSELECT * FROM USERSããªã©ã®ã¯ãšãªãå®è¡ããå ŽåããUSERSããšããååã®ããŒãã«æ€çŽ¢ã¯ãã³ã³ãã€ã«äžã§ã¯ãªãå®è¡æã«å®è¡ãããŸãã åçãã€ã³ãã£ã³ã°ã«ãããPostgreSQLã®æé ã¯éåžžã«æè»ã«ãªããŸãããOracleãããã¯ããã«å€ãã®ã©ã³ã¿ã€ã ãšã©ãŒãçºçãããããªããŸãã
- ããã©ã«ãã§ã¯ãPostgreSQLé¢æ°ã¯çŸåšã®ãŠãŒã¶ãŒã®ããŒããã·ã§ã³ã»ããã§å®è¡ãããŸãïŒOracleã§ã¯ãé¢æ°ã®äœæè ã®ããŒããã·ã§ã³ãããã©ã«ãã§äœ¿çšãããŸãïŒã ãã®ãªãã·ã§ã³ã¯ãå¿ èŠãªåé¢æ°ã§æ瀺çã«åå®çŸ©ã§ããŸãã
- 空è¡ã¯NULLãšåãã§ã¯ãããŸããã Oracleãšã¯ç°ãªããPostgreSQLã¯varcharãŸãã¯ããã¹ããNULLãšé£çµãããšåžžã«NULLãè¿ããŸãã çµæã誀ã£ãŠç¡å¹ã«ãããªãããã«ãããŒã«ã«å€æ°ã¯åžžã«ç©ºçœè¡ã§åæåããŠãã ããã
- PostgreSQL DDLæäœã¯ãã©ã³ã¶ã¯ã·ã§ã³ã§ãã ããŒãã«ãšé¢æ°ã®äœæãåã¿ã€ãã®å€æŽãããŒãã«ã®ã¯ãªã¢ïŒTRUNCATEïŒãªã©ãã³ãããããå¿ èŠããããŸãã
- é¢æ°ã®ã·ã°ããã£ãå ã®ãã®ãšç°ãªãå Žåãé¢æ°ãæ°ããããŒãžã§ã³ã«çœ®ãæããããšã¯å€±æããŸãã ãã®ç¶æ³ã§ã¯ããé¢æ°ã®äœæãŸãã¯çœ®æããå®è¡ããã ãã§ã¯äžååã§ããå€ãããŒãžã§ã³ã®é¢æ°ãåé€ïŒããããïŒããŠãåäœæããå¿ èŠããããŸãã
- ããŒã¿ããŒã¹ãšã©ãŒãçºçãããšãçŸåšã®ãã©ã³ã¶ã¯ã·ã§ã³ããšã©ãŒãšããŠããŒã¯ãããããããã©ã³ã¶ã¯ã·ã§ã³ã¯ROLLBACK以å€ã®ã³ãã³ããå®è¡ã§ããŸããã ãã ãããã®ãããªãã©ã³ã¶ã¯ã·ã§ã³ã¯ããšã©ãŒãçºçããåã«å®äºããæåŸã®ååä»ãã»ãŒããã€ã³ãïŒSAVEPOINTïŒã«ããŒã«ããã¯ã§ããŸãã ã»ãŒããã€ã³ããžã®ããŒã«ããã¯åŸããã©ã³ã¶ã¯ã·ã§ã³ã¯åŒãç¶ãåäœããã³ã³ãããã§ããŸãïŒãã®ææ³ã¯çµ±åãã¹ãã§äœ¿çšããããšã©ãŒã«é¢ä¿ãªãå®è¡ãç¶ç¶ããå¿ èŠããããŸãïŒã
- è€æ°ã®åæã«ã¢ã¯ãã£ããªDataReaderã¯ãããŒã¿ããŒã¹ãžã®åãæ¥ç¶ã§ã¯ãµããŒããããŠããŸããïŒããããMARSã¢ãŒã-è€æ°ã®ã¢ã¯ãã£ããªçµæã»ããïŒã è€æ°ã®ããŒã¿ã»ãããèªã¿åãã«ã¯ãåããŒã¿ã»ããã«1ã€ãã€ãè€æ°ã®ããŒã¿ããŒã¹æ¥ç¶ãéãããã¯ãšãªãé çªã«å®è¡ããå¿ èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒãå ã®ç¹å®ã®ããŒã¿ããŒã¹ã®æ©èœããå®å šã«æœè±¡åããããšã¯åžžã«å¯èœãšã¯éããŸããã å€ãã®å Žåãã³ãã³ããŸãã¯ãµãŒãã¹ã§ã¯ãåçSQLã¯ãšãªãäœæããŠå®è¡ããããã¹ãã¢ãããã·ãŒãžã£ãåŒã³åºãããããå¿ èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ã«ã¯ããªã¬ãŒããã¥ãŒãå¶çŽããŸãã¯ã€ã³ããã¯ã¹ãå¿ èŠãªå ŽåããããããOracleã¢ããªã±ãŒã·ã§ã³éçºè ã¯å°ãªããšãåºæ¬çãªPostgreSQLããããã£ãç解ããå¿ èŠããããŸãã
以äžã¯ã説æããããã€ãã®å°é£ã«å¯ŸåŠããã®ã«åœ¹ç«ã€ããã€ãã®æ瀺ã§ãã
PL / PgSQLã³ãŒãã§åçãã€ã³ãã£ã³ã°ããã€ãã¹ããæ¹æ³
åçãã€ã³ãã£ã³ã°ã¯åŒ·åãªã¡ã«ããºã ã§ãããå Žåã«ãã£ãŠã¯åçã¯ãšãªã®å®è¡ïŒEXECUTE sqlïŒã眮ãæããããšãã§ããŸãã ã³ã€ã³ã®è£åŽã¯ããã¶ã€ã³ã®è匱æ§ãã³ã³ãã€ã«äžã®ãã§ãã¯ã®æ¬ åŠã§ãã ã³ã³ãã€ã©ã¯ãç¹å®ã®ã·ã³ãã«ãããŒã¿ããŒã¹ãªããžã§ã¯ããåç §ããŠãããã©ãããéçã«ãã§ãã¯ã§ããŸããã
é¢æ°ãããŒãã«ãé¢æ°ãªã©ã®ã·ã³ãã«ãåç §ããå Žåãç¹å®ã®ãªããžã§ã¯ãã¯é¢æ°ã®å®è¡äžã«ã®ã¿ååã§æ€çŽ¢ãããŸãã ããã«ãå€æ°ãsearch_pathãã®å 容ã¯ãã®æ€çŽ¢ã«åœ±é¿ããŸããã€ãŸããçŸåšã®ã»ãã·ã§ã³ã®èšå®ã«å¿ããŠãä»»æã®ã¹ããŒã ã§ã·ã³ãã«ãèŠã€ããããšãã§ããŸãã
ããã¯éåžžããã§ã¯ãããŸããã
åçã¹ããããç¡å¹ã«ããã«ã¯ã2ã€ã®ç°¡åãªã«ãŒã«ã«åŸããŸãã
- è¡ãset search_path toïŒcurrent schema nameïŒãããã¹ãŠã®é¢æ°å®çŸ©ã«è¿œå ãã
- çŸåšã®ã¹ããŒãå€ã®ãã¹ãŠã®ããŒãã«ããã¹ããŒãã®ååã§ä¿®é£ŸããŸãã
ããã¯ãã€ã³ãã£ã³ã°ãéçã«ããŸããïŒPostgreSQLã¯ãŸã æåã®æå¹æ§ããã§ãã¯ããŸããïŒããæå³ããã«æåãä»ã®äœãã«ãã€ã³ãããå¯èœæ§ãç¡å¹ã«ããŸãã
åçãã€ã³ãã£ã³ã°ã®åœ±é¿ãåããªããªã£ãPL / PgSQLé¢æ°ã®ãœãŒã¹ã³ãŒãã®äŸã次ã«ç€ºããŸãã
-- current search_path = my_schema create or replace function my_func(my_arg text) returns void as $$ declare v_id bigint; begin perform another_func(my_arg); -- same as perform my_schema.another_func(my_arg); select id into v_id from kernel.users -- table name is qualified with kernel schema name where login = my_arg; -- the rest is skipped... end $$ language plpgsql set search_path to my_schema;
é¢æ°ã«é©çšãããèš±å¯ããªãŒããŒã©ã€ããã
ããã©ã«ãã§ã¯ãPostgreSQLã®é¢æ°ã¯ãOracleãªãã·ã§ã³ãAUTHID CURRENT_USERããšåæ§ã«ãçŸåšã®DBMSãŠãŒã¶ãŒã®æš©éã»ããã§åŒã³åºãããŸãïŒããã©ã«ãã§ã¯ãOracleã¯ç°ãªãã¢ãŒããAUTHID DEFINERãã䜿çšããŸãïŒã
Oracleã®åäœããšãã¥ã¬ãŒãããã«ã¯ã次ã®ããã«é¢æ°ã§ãã»ãã¥ãªãã£ãªãã·ã§ã³ãããªãŒããŒã©ã€ãããå¿ èŠããããŸãã
create or replace function my_secure_func() returns void as $$ begin -- call here any functions available to the superuser end $$ language plpgsql security definer; -- default is security invoker
Oracleã¹ã¿ã€ã«ã®ã°ããŒãã«äžæããŒãã«ãšãã¥ã¬ãŒã·ã§ã³
PostgreSQLã®äžæããŒãã«ã®ã»ãã³ãã£ã¯ã¹ã¯ãOracleãšã¯å€§ããç°ãªããŸãã éãã®æŠèŠã¯æ¬¡ã®ãšããã§ãã
- Oracleã®äžæããŒãã«ã¯å®æ°ã§ããã€ãŸãããã®æ§é ã¯åºå®ããããã¹ãŠã®ãŠãŒã¶ãŒã«è¡šç€ºãããå 容ã¯äžæçã§ãã
- PostgreSQLã§ã¯ã䜿çšããåã«äžæããŒãã«ãäœæãããŸãã äžæããŒãã«ã®æ§é ãšå 容ã®äž¡æ¹ã¯ããã®ããŒãã«ãäœæããçŸåšã®DBMSããã»ã¹ã«ã®ã¿è¡šç€ºãããŸãã PostgreSQLã®äžæããŒãã«ã¯ãã»ãã·ã§ã³ã®çµäºæãŸãã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®çµäºæã«åžžã«åé€ãããŸãã
- Oracleã§ã¯ãäžæããŒãã«ã¯åžžã«äœæäžã«æå®ãããç¹å®ã®ã¹ããŒãå ã«é 眮ãããŸãã
- PostgreSQLã§ã¯ãäžæããŒãã«ãä»»æã®ã¹ããŒã ã«é 眮ããããšã¯ã§ããŸãã;ãããã¯åžžã«ç¹å¥ãªæé»ã®äžæã¹ããŒã ã§äœæãããŸãã
pack_tempã¹ããŒãã«ã¯ãOracleã¹ã¿ã€ã«ã®äžæããŒãã«ããšãã¥ã¬ãŒãããã©ã€ãã©ãªãå«ãŸããŠããŸãã é¢å¿ã®ããæ©èœã¯2ã€ã ãã§ãã
create_permanent_temp_table(table_name [, schema_name]); drop_permanent_temp_table(table_name [, schema_name]);
æ°žç¶çãªäžæããŒãã«ã®äœæã¯ã次ã®2ã€ã®æé ã§è¡ãããŸãã
- éåžžã®PostgreSQLäžæããŒãã«ïŒãã©ã³ã¶ã¯ã·ã§ã³ã®çµäºæã«åé€ãããããŒãã«ïŒãäœæããŸãã
- create_permanent_temp_tableé¢æ°ãåŒã³åºããŠããã®äžæããŒãã«ãæ°žç¶çãªããŒãã«ã«å€æããŸãã
create temporary table if not exists another_temp_table ( first_name varchar, last_name varchar, date timestamp(0) with time zone, primary key(first_name, last_name) ) on commit drop; -- create my_schema.another_temp_table select pack_temp.create_permanent_temp_table('another_temp_table', 'my_schema'); -- or create another_temp_table in the current schema -- select create_permanent_temp_table('another_temp_table'); -- don't forget to commit: PostgreSQL DDL is transactional commit;
ããã«ãããã°ããŒãã«OracleäžæããŒãã«ãšãŸã£ããåãããã«åäœãããã¥ãŒãäœæãããŸãã drop_permanent_temp_tableé¢æ°ã§åé€ã§ããŸãã
åãããŒã¿ããŒã¹æ¥ç¶äžã®è€æ°ã®ã¢ã¯ãã£ããªDataReader
ããã¯PostgreSQLã®æãåä»ãªå¶éã§ããåããŒã¿ããŒã¹æ¥ç¶ã§ã¯ãäžåºŠã«1ã€ã®DataReaderããéãããšãã§ããŸããã
æ°ãããªã¯ãšã¹ãã¯ãåã®ãªã¯ãšã¹ããå®è¡ããã³åŠçããããŸã§å®è¡ã§ããŸããã
ãã®åé¡ã¯ãããŸããŸãªåœ¢åŒã®ã¢ããªã±ãŒã·ã§ã³ãµãŒãã¹ãLINQã¯ãšãªãããã³SQLã¯ãšãªã§å®æçã«çºçããŸãã 以äžã«å žåçãªäŸãããã€ã瀺ããŸãã
- LINQã¯ãšãªã¯å®æ°ã䜿çšããŸãïŒãŸãã¯ãµãŒãã¹ãåŒã³åºããŸãïŒã èŠæ±ã¯æåã®DataReaderãéããå®æ°ãµãŒãã¹ã¯2çªç®ã®DataReaderãéãããšãããšã©ãŒãåãåããŸãã ãšã©ãŒãåãé€ãã«ã¯ãã¯ãšãªãå®è¡ããåã«ããŒã«ã«å€æ°ã®å®æ°ãèªã¿åãå¿
èŠããããŸãïŒãŸãã¯ã¯ãšãªçµæãèªã¿åã£ãåŸã«ãµãŒãã¹ãåŒã³åºããŸãïŒã äŸïŒ
// var query = from a in DataContext.GetTable<Agent>() where a.ID = Constants.TestAgentID select a; // var testAgentId = Constants.TestAgentID; var query = from a in DataContext.GetTable<Agent>() where a.ID = testAgentId select a;
- LINQã¯ãšãªã®çµæã¯ã«ãŒãã§åŠçãããŸãããLINQãSQLãã«é¢ä¿ãªããã«ãŒãã®æ¬äœã¯2çªç®ã®ã¯ãšãªãå®è¡ããŸãã å¶éãåé¿ããæ¹æ³ïŒã¯ãšãªã®çµæããªã¹ããŸãã¯é
åã«å
·äœåããæåã®ã¯ãšãªãå®äºããåŸã«ãªã¹ããå®è¡ããŸãã äŸïŒ
// foreach (var langId in DataContext.GetTable<Language>().Select(x => x.ID)) { using (LanguageService.UseLanguage(langId)) { // do something language-specific } } // foreach (var langId in DataContext.GetTable<Language>().Select(x => x.ID).ToIDList()) { using (LanguageService.UseLanguage(langId)) { // do something language-specific } }
- LINQã¯ãšãªå
ã§ToArray / ToList / ToIDListãåŒã³åºããŸãã ä¿®æ£ããã«ã¯ããªã¯ãšã¹ããéšåã«åå²ããå¿
èŠããããŸãã
// var dictionary = DataContext.GetTable<CalendarDayStatus>().Where(d => dates.Contains(d.DT)) .GroupBy(g => g.DT, e => e.StatusID) .ToDictionary(k => k.Key, e => e.ToIDList()); // var dictionary = DataContext.GetTable<CalendarDayStatus>() .Where(d => dates.Contains(d.DT)) .GroupBy(g => g.DT, e => e.StatusID) .ToDictionary(p => p.Key); var dict = dictionary.ToDictionary(p => p.Key, p => p.Value.ToIDList());
æ®å¿µãªããããã®ã¿ã€ãã®ãšã©ãŒã¯éçã«æ€åºããã®ãéåžžã«å°é£ã§ãã ãããã£ãŠãããããã®éèŠã§ãªãLINQã¯ãšãªã培åºçã«ãã¹ãããŠãåæã«è€æ°ã®DataReaderãéãããšããŠããªãããšã確èªããå¿ èŠããããŸãã
次ã¯ïŒ
PostgreSQLããŒã ãšã®çžäºäœçšãéäžçã«éçºããäºå®ã§ãã å®éãã»ãšãã©ã®å¶éã¯ä¹ãè¶ããããªãããã«èŠããŸããããããããPostgreSQLã³ãŒãã«é©åãªå€æŽãå ããããã®ãªãœãŒã¹ãèŠã€ããããšãã§ããŸãã
ããšãã°ããžãªããŒã¿åŠçã®ãµããŒããªã©ãPostgreSQLãæ¢ã«åããŠããæ©èœã®äžéšã¯äœ¿çšããŸããã§ããããå°æ¥ã®ããŒãžã§ã³ã§äœ¿çšã§ããããšãé¡ã£ãŠããŸãã
ãããã«ãããäž¡æ¹ã®ããŒãžã§ã³-軜éSolid12ããã³ãšã³ã¿ãŒãã©ã€ãºUltimate Solid-ã䞊è¡ããŠéçºããããã¹ãŠã®éèŠãªæ©èœããã©ãããã©ãŒã ã®äž¡æ¹ã®ããŒãžã§ã³ã§ãµããŒããããŸãã