Szerintetek lehetséges-e Pro*C-ben connection-önként vagy CONTEXT-enként más-más karakterkészletet(*) használni? Ez azért volna jó, mert esetenként a program különböző komponensei különböző adatbázisokkal dolgoznak, és esetleg szükség lehet rá, hogy különböző beállításokkal menjenek (mondjuk az egyik egy fájlt akar írni, rögzített utf8 karakterkészlettel, a másik a felhasználóval kommunikálna, és a pillanatnyi LC_CTYPE függvényében állítaná be a NLS_LANG-ot).
Ilyesmiket próbáltam:
1. a két említett környezeti változó cseréje futás közben (setenv(3)): nem hat rá, úgy tűnik egyszer olvassa be, induláskor
2. a CONTEXT-ből kiszedni az OCIEnv-et (SQLEnvGet), aztán azt megerőszakolni: OCIAttrSet(OCI_ATTR_ENV_CHARSET,<number>)
az OCI leírás lebegteti, hogy ilyet esetleg csinálni, de csak minden más OCI hívás előtt. Hát nekem nem ment; ORA-24315: illegal attribute type 3. kétségbeesés, hajtépés: ez sem vált be...
(*) Illetve karakterkészlet-párost, az egyik a 'sima', ami a NLS_LANG harmadik mezőjéből jön, és a 'national', ami a NLS_NCHAR-ból. Az elsőt használja általában, a másodikat a 'CHARACTER SET IS NCHAR_CS' attribútumú mezőkhöz. (Lásd még az OCIEnvNlsCreate két utolsó paraméterét.)
Bocsánat, hogy belekontárkodok, de szerintem nem kell union all csak union, mert úgy mind a 3 select groupnak belekerülne minden sora,
és a rownum-ot ki kell emelni a group-ból.
Példád alapján, valahogy így:
with a as (select rownum r, a1.* from (select oszlop, count(*) db from ... group by ...) a1) b as (select ... c as (select ... u as (select r from a union select r from b union select r from c) select a.oszlop, a.db, b.oszlop, b.db, c.oszlop, c.db from a,b,c,u where u.r=a.r(+) and u.r=b.r(+) and u.r=c.r(+);
itten most relációs adatbáziskezelésről beszélünk. attól relációs, hogy az egy sorhoz tartozó különböző oszlopokban levő értékeknek köze van egymáshoz. ha az első sor az hogy sanyi, szőke, 1999, 175 akkor az azt jelenti hogy sanyi 1999ben született, szőke és 175 cm magas.
amiről beszélsz, ott a táblát nem tekinted relációnak, nincs kapcsolat az oszlopok között. akarod tudni a nevek listáját gyakorisággal, a hajszínek listáját gyakorisággal, szüldátumok listáját gyakorisággal. tiszta sor, csak akkor ez három külön reláció, három külön lekérdezés, három külön aggregálás. az hogy te egyben, egymás mellett akarod látni őket, az formaság, nem relációs adatbázis kezelés. az elvárt kimenetben az első sor első és harmadik mezője között nincs semmilyen kapcsolat, nincsenek relációban egymással.
persze meg lehet csinálni, csak még workaroundnak is rossz. tipikus főiskolai házifeladat.
Vonatkoztass el a látottaktól annyiban, hogy az 'csak' egy tábla kimeneti megjelenítése, mindegy hogy 3 vagy akárhány oszlopról van szó a megvalósítást illetően.
A téma az lenne amit és ahogy írtam, ez egy tábla oszlopaiban lévő különböző értékek. annyi, hogy azok előfordulását (számosságát) mindig az oszlop mellé tett count értékeket tartalmazó +1 oszlopba kellene tenni.
Gyakorlatilag ezt query-t kellene a példa output szerint 'összetenni egymás MELLÉ':
SELECT A.oszlop_1, COUNT(t.oszlop_1) db FROM table A GROUP BY A.oszlop_1 ;
SELECT A.oszlop_2, COUNT(t.oszlop_2) db FROM table A GROUP BY A.oszlop_2 ;
SELECT A.oszlop_3, COUNT(t.oszlop_3) db FROM table A GROUP BY A.oszlop_3 ;
Table created SQL> INSERT INTO scott.emp 2 (empno, ename, job, mgr, hiredate, sal, comm, deptno) 3 SELECT empno - 4000, 4 ename, 5 job, 6 mgr, 7 hiredate, 8 CASE 9 WHEN job = 'MANAGER' THEN 10 sal + 100000000 11 ELSE 12 sal 13 END sal, 14 comm, 15 deptno 16 FROM scott.emp log errors 17 INTO scott.hiba_ora('EMP INSERT ERRORS') reject LIMIT unlimited;
22 rows inserted
SQL> SELECT ORA_ERR_MESG$, ORA_ERR_TAG$, EMPNO FROM scott.hiba_ora;
ORA_ERR_MESG$ ORA_ERR_TAG$ EMPNO --------------------------------------------------------------------------------------------------- ------------------------ -------- ORA-01438: a megadott érték hosszabb, mint amelyet az oszlopra definiált pontoss EMP INSERT ERRORS 3566 ORA-01438: a megadott érték hosszabb, mint amelyet az oszlopra definiált pontoss EMP INSERT ERRORS 3698 ORA-01438: a megadott érték hosszabb, mint amelyet az oszlopra definiált pontoss EMP INSERT ERRORS 3782
SQL> drop table scott.hiba_ora purge;
Table dropped SQL> delete from scott.emp t 2 where t.empno not in (7369,7499,7521,7566,7654,7698,7782,7788,7839,7844,7876,7900,7902,7934);
mi az hogy sok? copy paste csodákra képes. 100 felett meg írnék egy selectet ami előállítja a selecttet ami kell. nem érdemes sok energiát tenni bele, mert csak egyszer kell.
Ha dob egy olyan hibaüzenetet, hogy ORA-01438: value larger than specified precision allowed for this column, akkor mi a legegyszerűbb módja kitalálni, hogy melyik oszloppal van a problémája?
Megpróbáltam egy create table-t, hogy összehasonlítsam, de legalább 12 oszopból csinált numbert, az eddig number(9) helyett.
Azért kérdezem, mert igazából azt a sort kellene elkapnom, ami hibás, nem a táblastruktúrán változtati.
Egyben előterjesztem, hogy akinek van tudomása 'haladó sql témájú', minőségi oldalról - megoszthatná a közönséggel, hogy pl kevesebb idegesítő kérdést tegyenek fel itt... :-)
a teszteset generálás egy külön tudás. kell hozzá egy kis ismeret meg tapasztalat, de hamar sikerül olyan adatot generálni ami tuti hozza egy ilyen query minden részletét.
A nyers 'futtassuk le a két különbözően megírt kódot és nézzük meg mi lesz az eredménye, hogy abból következtessük ki hogyan működik' elv nem minden esetben helyes vagy követendő..
Sok függ attól hogy milyen adathalmazra nézzük meg a példát.. Futottam már bele abba hogy egy aggregálásra két különböző QUERY ugyanazt az eredményt hozta, pedig logikai különbség volt köztük, ami egy másik alkalommal egy eltérő logikai aggregálás mentén ki IS bukott..
persze nem emberek és életkorok, de majdnem. és persze van a táblában egy aktív-nem aktív mező is, meg pár egyéb bonyolítás. csak lecsupaszítottam hogy a lényegre lehessen koncentrálni, ettől persze feladványszerűvé vált, mert azok is ilyen csupaszok.