Keresés

Részletes keresés

spiler0078 Creative Commons License 2014.10.10 0 0 5105

Szia!

 

Köszi a segítséget! Működik!

Viszont most valami miatt a TRUNC(SYSDATE) -et nem eszi meg.

Eddig nem volt ilyen gondom, de most nem tudom miért nem fogadja el....

 

Azt mondja ORA-01898: túl sok számpontosság megadás.

Szerinted mi lehet a bibi?

 

 

Köszi

spiler

Előzmény: dorog.zultan (5104)
dorog.zultan Creative Commons License 2014.10.10 0 0 5104

Szia, 

 

próbáld meg így:

 

sqlp1:='INSERT INTO ' || boltnev || ' (meboazon,meusazon,mefelvdate,meveazon,meteazon,memenny)
VALUES (' || valt4 || ',' || vusazon || ',' || TRUNC(SYSDATE) || ',' || :P6_XVEVO2 || ',' || :P6_XTERMEK2 || ',' || :P6_XMENNY || ')';

 

üdv

 

Előzmény: spiler0078 (5101)
spiler0078 Creative Commons License 2014.10.10 0 0 5103

Szia!

 

ORACLE APEX PL SQL Anonymus Block-ban kéne hogy fusson, de hibával elszáll...


Azt szeretném, hogy egy SQL scriptben ki tudjam olvasni a táblanevet egy változóból.

 

pl:

INSERT INTO &táblaneve (mezo1,mezo2) VALUES (valtozo1,valtozo2);

 

 

 

 

köszi

spiler

Előzmény: NevemTeve (5102)
NevemTeve Creative Commons License 2014.10.10 0 0 5102

Ennek Sql*Plus-ban kellene mennie, vagy esetleg valamilyen programba van beágyazva (Pro*C, pl)?

Előzmény: spiler0078 (5101)
spiler0078 Creative Commons License 2014.10.10 0 0 5101

Szia!

 

A valt4 és a vusazon két változó.

Az első egy szám: boltazonosító; a második is szám és az az ügyfél azonosító.

A :P6_XVEVO2,:P6_XTERMEK2 select list-ek.

 

kimásoltam az egész scriptet, hátha így érthetőbb:

Amit meg szeretnék oldani, az az hogy egy változóban rakom össze a táblák nevét ahova be akarok szúrni adatokat... 

 

DECLARE
  valt4 NUMBER;
  boltnev VARCHAR2(255);
  vusazon NUMBER;
  sqlp1 varchar2(1000);

 

BEGIN
  vusazon:=GET_USER_ID(:APP_USER);  -- ez a függvény a bejelentkezett felhasználó id-t adja visza

  valt4:=GET_USER_BOLT(:APP_USER);  -- ez pedig a hozzá kapcsolt bolt id-t
 

  SELECT botanev INTO boltnev FROM eu_bolt WHERE boazon=valt4;

 

  sqlp1:='INSERT INTO '||boltnev||' (meboazon,meusazon,mefelvdate,meveazon,meteazon,memenny)
  VALUES (valt4,vusazon,TRUNC(SYSDATE),:P6_XVEVO2,:P6_XTERMEK2,:P6_XMENNY)';

  EXECUTE IMMEDIATE sqlp1;

END;

 

 

Előzmény: halaloszto (5100)
halaloszto Creative Commons License 2014.10.10 0 0 5100

mi az a valtnev meg vusazon? ha az ket valtozo, akkor vagy azok is kettospontos bind valtozok kellene legyenek, vagy azokat is be kellene konkatenalni. (utobbi erosen ellenjavallt, lasd sql injection attack)

 

az execute-kor meg kellene adni a bind valtozok ertekeit, kulonben hogyan hajtsa vegre?

 

execute immediate sqlp1 using 'pisti','vasszog',3;

 

aprosagok: ez plsql? a kapcsoszarojel oda tuti nem kell. a sysdate az nem fuggveny, nem kell utanna ()

 

Vajk

 

 

Előzmény: spiler0078 (5099)
spiler0078 Creative Commons License 2014.10.10 0 0 5099

Sziasztok!

 

Szeretnék egy kis segítséget kérni. 

Egy egyszerű insertálást szeretnék egy adott táblába végrehajtani úgy hogy a tábla nevét előtte egy változóban ( boltnev  VARCHAR2(255);) rakom össze, de mindig azzal a hibával száll el, hogy nem megengedett tábla név.

Hogyan tudom apexben egy pl sql anonymus block-ban (after submitban) ezt összerakni?

 

Ez a kódom:

 

sqlp1:=q'{INSERT INTO '||boltnev||' (meboazon,meusazon,mefelvdate,meveazon,meteazon,memenny)

VALUES (valt4,vusazon,TRUNC(SYSDATE()),:P6_XVEVO2,:P6_XTERMEK2,:P6_XMENNY)}';

EXECUTE IMMEDIATE sqlp1;

 

egy másik kóddal pedig annyit ír, hogy "hiányzik a csukó zárójel":

 

sqlp1:='INSERT INTO '||boltnev||' (meboazon, meusazon, mefelvdate, meveazon, meteazon, memenny)
VALUES (valt4, vusazon, TRUNC(SYSDATE()), :P6_XVEVO2, :P6_XTERMEK2, :P6_XMENNY)';

EXECUTE IMMEDIATE sqlp1;

 

Tudna valaki segíteni, hogy mit rontok el

köszi

Spiler

halaloszto Creative Commons License 2014.10.09 0 0 5098

ugyanezt fogja csinálni az is, kíváncsi vagyok az eredményre, de meg leszek lepve ha gyorsabb.

 

Vajk

Előzmény: dorog.zultan (5097)
dorog.zultan Creative Commons License 2014.10.09 0 0 5097

Szia,

 

igen, nagyon macerás, és nagy adattömegnél lassú is.

A "DBMS_REDEFINITION"-t kipróbálom, köszönöm!

 

üdv

Előzmény: halaloszto (5096)
halaloszto Creative Commons License 2014.10.09 0 0 5096

nincs mas modszer. 

egyszerunek tunik: create table new as select from old ; drop old; rename new to old

valojaban az indexeket, constraintokat, foreign keyeket, grantokat meg a fene tudja meg mi mindent meg kell tartani, ami egesz maceras.

 

DBMS_REDEFINITION eleg regota van, ugyanezt csinalja, csak rendesen osszeszedtek mi mindenre kell figyelni es meg is csinalja neked.

 

Vajk

Előzmény: dorog.zultan (5095)
dorog.zultan Creative Commons License 2014.10.09 0 0 5095

-- Sziasztok, 

-- Meg lehet valahogyan változtatni a mezők fizikai sorrendjét a táblákban?

-- a drop, create table módszer kivételével

 

-- Pl ezt:


create table TABLA_TESZT
(
ID NUMBER(8) not null,
FLD_B VARCHAR2(5),
FLD_A VARCHAR2(5)
)


-- erre:

 

create table TABLA_TESZT
(
ID NUMBER(8) not null,
FLD_A VARCHAR2(5),
FLD_B VARCHAR2(5)
)

 

(Nem élethalál kérdése, de nem lenne rossz, ha meg tudnám valahogy tenni)

F1DO Creative Commons License 2014.10.06 0 0 5094

Hát igen, ez így már az ami kell.. :-) legalább jó felé tapogatóztam..

 

még beleírva egy dátumformátumozót:

dbms_output.put_line(s.table_name||' '||to_char(d,'YYYY.MM.DD HH24:MI:SS')); -t 

 

- Tökéletes!

 

Köszi

 

 

 

Előzmény: halaloszto (5092)
halaloszto Creative Commons License 2014.10.06 0 0 5093

nezz utanna, de az lenne a korrekt ha az nls_territory lenne. ugyanigy a sorrendezes tortenetnek is erdemes utannanezni. 


Vajk

Előzmény: NevemTeve (5091)
halaloszto Creative Commons License 2014.10.06 0 0 5092

nade melyik exceptiont! mindig ird meg a hibat konkretan, mert neked lehet hogy nem jelent semmit ezert irrelevans, de nekunk meg eselyes hogy elmond mindent. 

 

pl most az all_tables-t kerdezed. abban meg ugye olyan tablak is vannak, amik nem a sajatjaid, de van rajuk select jogod. 

 

amikor direktben kerdezed, akkor ezert ki kell ird az ownert, mert nem a sajat semadban van. lasd tulajdonos1.konkret_tabla.

 

amikor a plsql kod epiti a query-t, akkor meg nem teszi bele az ownert, ezert ad hibauzenetet. es a hibauzenetbol egyertelmu is hogy azert "no luck" mert nem talalta a tablat, ugyanis a sajat semaban kereste. az en querym az user_tables-bol vette a tablanevet, az tuti hogy a sajat semaban van, nincs ilyen gond.

 

igy  a loop query-ben elo kell venni a tulajt is:

 

   for s in (select table_name, owner from all_tables ...

 

es a ciklusmagban amit epitunk queryt, abban is meg kell adni az ownert:

 

  execute immediate 'select scn_to_timestamp(max(ora_rowscn)) from '||s.owner||'.'||s.table_name into d;

 

Vajk

Előzmény: F1DO (5088)
NevemTeve Creative Commons License 2014.10.06 0 0 5091

Hú, erre nem is gondoltam eddig, köszi!

Előzmény: halaloszto (5090)
halaloszto Creative Commons License 2014.10.06 0 0 5090

ugy konnyu, akkor az nls_date_lang nem szamit. bar meglepetes lehet, mert valamelyik nls parameter kontrollalja pl hogy melyik a het elso napja...

 

Vajk

Előzmény: NevemTeve (5087)
F1DO Creative Commons License 2014.10.06 0 0 5089

bocsánat elírtam, az első, konkért esetben 'természetesen' nincs idézőjel között a táblanév, tehát így:

select scn_to_timestamp(max(ora_rowscn)) 
from tulajdonos1.konkrét_tábla 

míg a szűrt scriptben:

... where owner = 'tulajdonos1' and table_name like 'konkrét%' and  rownum < 6 

lehet hogy a táblanevek egyfajta karakteres adatként jelennek meg és már nem érhető el hozzájuk frissítési dátum.

itt lesz valahol a kutya elásva...

Előzmény: F1DO (5088)
F1DO Creative Commons License 2014.10.06 0 0 5088

Van egy konkrét tábla amit ellenőrzéshez használok.

 

Ha direktbe kérdezem le:

 

select scn_to_timestamp(max(ora_rowscn)) 
from 'tulajdonos1.konkrét_tábla' 

 

akkor kiírja a friss frissítési dátumot.

 

 

Ha ez a tábla a szűréssel együtt jön le:,

 for s in (select table_name from all_tables where owner = 'tulajdonos1' and table_name like 'konkrét%' and  rownum < 6 )

 

 akkor nem írja ki ezt a friss dátumot, hanem az exception-t dobja.

 

más táblára is megnézve azoknál is ugyanez a jelenség.

 

 

 

 

Előzmény: halaloszto (5086)
NevemTeve Creative Commons License 2014.10.06 0 0 5087

(mondjuk egy NLS_DATE_FORMAT=YYYYMMDD.HH24MISS jót tud tenni az olvashatóságnak, az biztos;)

Előzmény: halaloszto (5085)
halaloszto Creative Commons License 2014.10.06 0 0 5086

nono. a rownum-os where-t bennehagytad? szures nelkul az elso random 5 tablat veszi elo, es azok eleg frissek hogy tudja a datumot. a szuressel a teged erdeklo tablakat veszi elo, es ugy tunik azok tul regen modosultak ahhoz hogy meg tudjuk mondani az scn-bol a datumot. azokra  a tablakra ha szoloban vegrehajtod a select-edet, akkor is hibat fogsz kapni datum helyett.

 

Vajk

Előzmény: F1DO (5083)
halaloszto Creative Commons License 2014.10.06 0 1 5085

egyszeruen kiadsz a konnekson krealas utan egy alter session set nls_language='AMERICAN'-t, es kesz. a charset meg hasonlok eldonteset meghagynam a kliensnek. ha mazlink van ettol meg az nls_date_language sem valtozik meg, es nem lesz a Márciusból March. Azert van esely hogy valahol masutt lesz meglepetes, valami elkezd amerikaiul mukodni.

 

nem tudok jobb modszert sajna.

 

Vajk

Előzmény: NevemTeve (5081)
F1DO Creative Commons License 2014.10.06 0 0 5084

Köszönöm, ezt emésztgetem most..

Előzmény: halaloszto (5082)
F1DO Creative Commons License 2014.10.06 0 0 5083

A legutóbbi script-nél maradva:

az említett szűréseket beleírva ugyan kilistázza a feltételek szerint megszűrt táblaneveket, ám a legutolsó frissítési dátumot már nem tudja melléjük tenni, hanem az exception kerül kiírásra.

Táblanévre szűrés nélkül minden fasza..

halaloszto Creative Commons License 2014.10.06 0 0 5082

Azt kell meglatni, hogy ez a kod nem egy select. hanem egy select ami eloszedi a tablak neveit, es utanna tablankent egy-egy kulon select. tehat 20 tablara 21 select.

 

  for s in (select table_name from user_tables where rownum<6) loop

 

ez a sor generalja a tablak neveit. ha szurni akarsz, akkor 

 

  for s in (select table_name from user_tables where owner = 'XY' and table_name like 'táblanév első betűi%'  and rownum<6) loop

 

ha kell az osszes, akkor az and rownum<6-ot hagyd ki, ez csak annyit csinal hogy korlatoz az elso ot sorra. 

A ciklus belsejeben ugynevezett dinamikus sql-t hasznal. Nem parameterkent ad at tablanevet select-nek, met azt nem lehet (lasd kettes pont), hanem string muveletekkel (konkatenacio) epit egy select statementet, es azt vegrehajtja. Ennek a select-nek egy kimeno parametere van, a datum, ezt veszi at a D-be. Lehetne bemeno parametere is, de azt csak a select utani oszloplistaban es a where-ben hasznalhatnad, a from-ban nem (lasd kettes pont). 

Ez a string epitgetes: 'select scn_to_timestamp(max(ora_rowscn)) from '||s.table_name . ez egy string, stringmuveletekkel osszerakva.


Vajk

Előzmény: F1DO (5080)
NevemTeve Creative Commons License 2014.10.06 0 0 5081

Tegyük fel, hogy hiba történt az INSERT-ben, és sqlca.sqlcode==-1. Gyanítom, hogy valamilyen constraint sérült.

 

Vajon mit ténykedek, ha (magában a programban) szeretném megállapítani annak a contraint-nek a nevét, ami sérült, hogy isten ments valahogy megpróbáljam menteni a helyzetet, vagy legalább informatív hibaüzenetet adjak?

 

Nem találtam jobbat, mint hogy az SQLErrorGetText kimenetében megkerestem az első (vagy egyetlen) zárójelpárt, abban volt a constraint neve. Na, eddig ment, de ma a következőt kaptam: 'z'.... Némi nyomozás után bele is raktam a programba a következő üzenetet:

 

    if (q==p+1 && p[0]=='z') {  /* Ezt találtuk meg: "A(z)" */
        fprintf (stderr,
            "*** Valami jószándékú idióta az Oracle üzenetek"
            " nyelvét magyarra állította.n"
            "*** Kérlek javítasd ki:n"
            "export NLS_LANG=American_America.EE8ISO8859P2n");
        p= q+1;
        goto KERESS;
    }

F1DO Creative Commons License 2014.10.06 0 0 5080

SQL window-ban futattam és ez magyarázatot ad arra, hogy miért futott le a serveroutput on nélkül, viszont hogy miért nem írta ki az exception-öket az homály..

 

Az egész kód lefut szépen, ha nincs meghatározva a táblák köre, maximum arra korlátozódik, hogy all_tables, vagy user_tables. Azonban ez a halmaz így nincs eléggé leszűkítve. 

Nagyon jó lenne ha beleműthető lenne az alábbi feltételpáros:

...

where owner = 'XY'
and table_name like 'táblanév első betűi%'

 

A már korábban említett 

1. a select tablabol olvas

2. hogy melyik tablabol, az nem tud parameter lenni

pontokon kellene felülemelkedni..

 

- egyébként ez a mostani script is selectből olvas,

...

 for s in (select table_name from user_tables where rownum<6) loop

...

 - mégis lefut, ám ahogy a táblák körét, illetve azok nevét próbálom kiszűrni/átadni egyből nem működik, nem megy át a táblák neve, pedig trükköztem vele..

 

Összeségében egy szép ciklus motor lenne olyan esetekre, mikor meghatározott táblákon végigmenve kellene azokkal valami egyen műveleteket végezni.. 

 

Előzmény: dorog.zultan (5079)
dorog.zultan Creative Commons License 2014.10.06 0 0 5079

PL/SQL dev. "SQL Window"-ban nem kell bekapcsolni a "serveroutput" -ot.

A "Command Window"-ban igen, ott le is fut.

Előzmény: F1DO (5077)
halaloszto Creative Commons License 2014.10.06 0 0 5078

biztos lehet abban is, csak maskeppen kell bekapcsolni az outputot. nem hasznaltam kb soha, sajnos ebben nem tudok segiteni. a helpjeben ha rakeresel a dbms_output-ra, tuti megtalalod.


Vajk

Előzmény: F1DO (5077)
F1DO Creative Commons License 2014.10.06 0 0 5077

OK.

 

Toad-al lefut simán. Érdekes ilyenbe még nem futottam bele, hogy egy script az egyik Editorban lefut, a másikban nem..

 

Köszi mégegyszer.

Előzmény: halaloszto (5075)
F1DO Creative Commons License 2014.10.06 0 0 5076

Pl sql developert használok és az első sorra a hibaüzenet:

ORA-00922: Nem megengedett vagy hiányzó opció  

 

Az az érdekes hogy ezután rögtön dob egy másik hibaablakat is, miszerint 4. sor 93. oszlop: identifier 'D' must be declared és 4. sor 7. oszlop: statement ignored - azonban ha kihagyom az első sort, akkor ez nem jelenik meg, hanem a már említett módon lefut úgy hogy 'se kép, se hang'..

Előzmény: halaloszto (5075)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!