Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
Karlo - 14-12-2006 16:08
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
Witam
Od jakiego? czasu borykam si? z nast?puj?cym problemem:
Mam w bazie utworzon? pewn? kolekcj?. Chcia?bym warto?ci tej kolekcji przepisa? do tabeli. Próbuj? to wykona? w nast?puj?cy sposób:
INSERT INTO TMP_CLAS_PATH_OCCURRENCE ( CPO_TEMPLT_CLAS_ID, CPO_ROOT_NODE_ID, CPO_NODE_ID, CPO_VALID_FROM, CPO_VALID_TO, CPO_PATH, CPO_PATH_LENGTH, CPO_PARENT_NODE_ID, CPO_PARENT_VALID_FROM, CPO_PARENT_VALID_TO ) SELECT PathOcc.TemplateClassID, PathOcc.RootNodeID, PathOcc.NodeID, PathOcc.VFrom, PathOcc.VTo, PathOcc.Path, PathOcc.PathLength, PathOcc.ParentNodeID, PathOcc.ParentVFrom, PathOcc.ParentVTo FROM TABLE(PAR_PathOcc) PathOcc;
TMP_CLAS_PATH_OCCURRENCE to tabela w bazie danych, PAR_PathOcc to moja kolekcja typu TABLE_PathOccurrence. Typ ten jest zadeklarowany globalnie w nast?puj?cy sposób:
create or replace type REC_Pathoccurrence AS OBJECT ( TemplateClassID NUMBER(12), RootNodeID NUMBER(12), NodeID NUMBER(12), VFrom DATE, VTo DATE, Path VARCHAR2(256), PathLength NUMBER(12), ParentNodeID NUMBER(12), ParentVFrom DATE, ParentVTo DATE );
create or replace TYPE TABLE_PathOccurrence AS TABLE OF REC_PathOccurrence;
Niestety, w trakcie wykonania zapytania otrzymuj? nast?puj?cy b??d: ORA-22905: cannot access rows from a non-nested table item
Pomó?cie prosz?, bo ju? nie wiem, co robi?. Googlanie nic nie da?o. :(
Pozdrawiam, Karlo
aasat - 14-12-2006 16:08
hej
INSERT INTO TMP_CLAS_PATH_OCCURRENCE SELECT * FROM TABLE(CAST v_pathoccurence AS TABLE_PathOccurrence)
gdzie v_pathoccurence to jest zmienna ktora deklarujesz tak: v_pathoccurence TABLE_PathOccurrence := TABLE_PathOccurrence();
a potem wstawiasz wartosci
pozdrawiam wojtek
Karlo - 14-12-2006 16:08
aasat wrote: > hej > > INSERT INTO TMP_CLAS_PATH_OCCURRENCE > SELECT * FROM TABLE(CAST v_pathoccurence AS TABLE_PathOccurrence) > > > gdzie v_pathoccurence to jest zmienna ktora deklarujesz tak: > v_pathoccurence TABLE_PathOccurrence := TABLE_PathOccurrence(); > > a potem wstawiasz wartosci > > pozdrawiam > wojtek > > Nic z tego. :( Dostaj? b??d: ORA-14551: cannot perform a DML operation inside a query
Procedura wygl?da nast?puj?co: PROCEDURE Create_PathOccTempTable(PAR_PathOcc TABLE_PathOccurrence) IS v_pathoccurence TABLE_PathOccurrence := TABLE_PathOccurrence(); BEGIN v_pathoccurence:=PAR_PathOcc; INSERT INTO TMP_CLAS_PATH_OCCURRENCE SELECT * FROM TABLE(CAST v_pathoccurence AS TABLE_PathOccurrence); END Create_PathOccTempTable;
Mo?e jeszcze jakie? porady? Ja chyba czego? nie rozumiem. :( Wzoruj?c si? na przyk?adzie z ksi??ki "Oracle 9i PL/SQL. Poradnik programisty" zmieni?em moj? procedur?, która teraz wygl?da tak:
FOR i IN PAR_PathOcc.FIRST..PAR_PathOcc.LAST LOOP INSERT INTO TMP_CLAS_PATH_OCCURRENCE VALUES ( PAR_PathOcc(i).TemplateClassID, PAR_PathOcc(i).RootNodeID, PAR_PathOcc(i).NodeID, PAR_PathOcc(i).VFrom, PAR_PathOcc(i).VTo, PAR_PathOcc(i).Path, PAR_PathOcc(i).PathLength, PAR_PathOcc(i).ParentNodeID, PAR_PathOcc(i).ParentVFrom, PAR_PathOcc(i).ParentVTo ); END LOOP;
Czyli niemal przepisa?em przyk?ad ze str. 319 w/w ksi??ki. I co? I d... Znowu komunikat "ORA-14551: cannot perform a DML operation inside a query".
Pozdrawiam i z niecierpliwo?ci? czekam na kolejne pomys?y, Karlo
ThomasO@cpas.com - 14-12-2006 16:08
=?iso-8859-2?q?Re:_Oracle_PL/SQL_Wstawianie_wynik=F3w_kolekcji_do_tabeli?= Karlo wrote: > Witam > > Od jakiego? czasu borykam si? z nast?puj?cym problemem: > > Mam w bazie utworzon? pewn? kolekcj?. Chcia?bym warto?ci tej kolekcji > przepisa? do tabeli. Próbuj? to wykona? w nast?puj?cy sposób: > > INSERT INTO TMP_CLAS_PATH_OCCURRENCE > ( > CPO_TEMPLT_CLAS_ID, > CPO_ROOT_NODE_ID, > CPO_NODE_ID, > CPO_VALID_FROM, > CPO_VALID_TO, > CPO_PATH, > CPO_PATH_LENGTH, > CPO_PARENT_NODE_ID, > CPO_PARENT_VALID_FROM, > CPO_PARENT_VALID_TO > ) > SELECT > PathOcc.TemplateClassID, > PathOcc.RootNodeID, > PathOcc.NodeID, > PathOcc.VFrom, > PathOcc.VTo, > PathOcc.Path, > PathOcc.PathLength, > PathOcc.ParentNodeID, > PathOcc.ParentVFrom, > PathOcc.ParentVTo > FROM TABLE(PAR_PathOcc) PathOcc; > > TMP_CLAS_PATH_OCCURRENCE to tabela w bazie danych, PAR_PathOcc to moja > kolekcja typu TABLE_PathOccurrence. Typ ten jest zadeklarowany globalnie > w nast?puj?cy sposób: > > create or replace type REC_Pathoccurrence AS OBJECT > ( > TemplateClassID NUMBER(12), > RootNodeID NUMBER(12), > NodeID NUMBER(12), > VFrom DATE, > VTo DATE, > Path VARCHAR2(256), > PathLength NUMBER(12), > ParentNodeID NUMBER(12), > ParentVFrom DATE, > ParentVTo DATE > ); > > create or replace TYPE TABLE_PathOccurrence AS TABLE OF REC_PathOccurrence; > > Niestety, w trakcie wykonania zapytania otrzymuj? nast?puj?cy b??d: > ORA-22905: cannot access rows from a non-nested table item > > Pomó?cie prosz?, bo ju? nie wiem, co robi?. Googlanie nic nie da?o. :( > > Pozdrawiam, > Karlo Karlo, Versja Oracle ? Thomas
ThomasO@cpas.com - 14-12-2006 16:08
=?iso-8859-2?q?Re:_Oracle_PL/SQL_Wstawianie_wynik=F3w_kolekcji_do_tabeli?= Karlo wrote: > aasat wrote: > > hej > > > > INSERT INTO TMP_CLAS_PATH_OCCURRENCE > > SELECT * FROM TABLE(CAST v_pathoccurence AS TABLE_PathOccurrence) > > > > > > gdzie v_pathoccurence to jest zmienna ktora deklarujesz tak: > > v_pathoccurence TABLE_PathOccurrence := TABLE_PathOccurrence(); > > > > a potem wstawiasz wartosci > > > > pozdrawiam > > wojtek > > > > > Nic z tego. :( Dostaj? b??d: > ORA-14551: cannot perform a DML operation inside a query > > Procedura wygl?da nast?puj?co: > PROCEDURE Create_PathOccTempTable(PAR_PathOcc TABLE_PathOccurrence) > IS > v_pathoccurence TABLE_PathOccurrence := TABLE_PathOccurrence(); > BEGIN > v_pathoccurence:=PAR_PathOcc; > INSERT INTO TMP_CLAS_PATH_OCCURRENCE > SELECT * FROM TABLE(CAST v_pathoccurence AS TABLE_PathOccurrence); > END Create_PathOccTempTable; > > Mo?e jeszcze jakie? porady? Ja chyba czego? nie rozumiem. :( > Wzoruj?c si? na przyk?adzie z ksi??ki "Oracle 9i PL/SQL. Poradnik > programisty" zmieni?em moj? procedur?, która teraz wygl?da tak: > > FOR i IN PAR_PathOcc.FIRST..PAR_PathOcc.LAST LOOP > INSERT INTO TMP_CLAS_PATH_OCCURRENCE > VALUES ( > PAR_PathOcc(i).TemplateClassID, > PAR_PathOcc(i).RootNodeID, > PAR_PathOcc(i).NodeID, > PAR_PathOcc(i).VFrom, > PAR_PathOcc(i).VTo, > PAR_PathOcc(i).Path, > PAR_PathOcc(i).PathLength, > PAR_PathOcc(i).ParentNodeID, > PAR_PathOcc(i).ParentVFrom, > PAR_PathOcc(i).ParentVTo > ); > END LOOP; > > Czyli niemal przepisa?em przyk?ad ze str. 319 w/w ksi??ki. I co? I d... > Znowu komunikat "ORA-14551: cannot perform a DML operation inside a query". > > Pozdrawiam i z niecierpliwo?ci? czekam na kolejne pomys?y, > Karlo Karlo W versjach Oracle 9,10 INSERT ... SELECT nie moze uzywac "table collection expression", tylko subquery. Przyklad ktory podajesz uzywa LOOP i INSERT Inna metoda to uzyj FORALL. HTH Thomas
Karlo - 14-12-2006 16:08
ThomasO@cpas.com wrote:
> > Karlo > W versjach Oracle 9,10 INSERT ... SELECT nie moze uzywac "table > collection expression", tylko subquery. > Przyklad ktory podajesz uzywa LOOP i INSERT > Inna metoda to uzyj FORALL. > HTH > Thomas >
Dzi?ki, Thomas. Ju? doszed?em, co jest nie tak. Kiedy testowa?em procedur?, to u?ywa?em jej prostego wywo?ania. I dostawa?em b??d. Natomiast, kiedy umie?ci?em to w bloku BEGIN...END; wszystko zacz??o hula?.
Pozdrawiam i dzi?kuj?,
Karlo
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle 19g +Insert +Insert +Insert...
MSSQL Express czy Oracle Express
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
[Oracle, Toad] Zaladowanie obiektu w TOAD
[Oracle][Reports30] 10G nie dziala razem z Reports3.0
klient oracle (zmiana domyslna klienta oracla)
[oracle] [xml] XML na bazie istniejacej struktury ?
[Oracle] W jaki sposób skopiować całą zawartość schemy jednego użytkownika do nowo utworzonego użytkownika?
klient Oracle 10g SE a Windows 98 SE
Oracle Standard Edition One - czym sie rozni od wersji standard iexpress?
zanotowane.pldoc.pisz.plpdf.pisz.plshanti.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|