Portál AbcLinuxu, 12. května 2025 16:34

Dotaz: Vytvoření tabulky v PL-SQL proceduře

9.11.2009 22:29 tascoa | skóre: 11
Vytvoření tabulky v PL-SQL proceduře
Přečteno: 2119×
Odpovědět | Admin
Dobrý den, poradíte mi někdo, kde mám chybu při vytváření tabulky v pl/sql proceduře?
create or replace procedure kopieTabulky(jmeno_tabulky VARCHAR2)
as 
begin
  execute immediate 'create table jmeno_tabulky as select * from zamestnanec';
end;
následně spustím:
execute kopieTabulky('empT');
ORA-Error:
ORA-00955: název je již užíván existujícím objektem
ORA-06512: na "dbschema.KOPIETABULKY", line 4
ORA-06512: na line 2
Děkuji za rady.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

10.11.2009 10:29 Robo
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
Odpovědět | | Sbalit | Link | Blokovat | Admin
a naco chces vytvarat tabulku procedurou? Vyzera to, ze ta tabulka uz existuje.
10.11.2009 12:16 jekub
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
Odpovědět | | Sbalit | Link | Blokovat | Admin
execute immediate 'create table '||jmeno_tabulky||' as select * from zamestnanec'
10.11.2009 17:27 Ivan
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tohle je blbost a nikdy to nemuze poradne fungovat. Podobny veci delali lidi ktery prechazeji s MSSQL, Accessu nebo MySQL. Ackoliv se to nezda tak PL/SQL je kompilovany jazyk, ktery je zpracovavany nejakou virtualni masinou. Ono to neni na prvni pohled videt, protoze Oracle si uklada numericky object_id pro vsechny tabulky, pohledy a procedury a taky zna dependecy tree pro vsechny objekty. Pokud dojde k zmene definice objektu, tak se taky rekompiluji zavisle objekty. Takze nemuzete v PL/SQL procedure dropnout a zase vytvorit tabulku, pokud na ni ta sama procedura zavisi.

Obecne plati, ze v Oracle by nikdy nemely volat DDL na produkcnim systemu - protoze k tomu proste neni duvod. Na to ceho chcete dosahnout urcite existuji jine prostredky.
10.11.2009 23:15 tascoa | skóre: 11
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
Tak jak byste prosím řešil následující zadání v testu v nejmenovaném předmětu na nejmenované vysoké škole:

Napiste ulozenou PL/SQL proceduru KopieTabulky(jmeno_tabulky), ktera vytvorı tabulku se jmenem jmeno_tabulky_cp, ktera bude obsahovat stejne atributy se stejnymi datovymi typy jako puvodnı tabulka. Do nove tabulky pak zkopırujte vsechny zaznamy...
11.11.2009 03:13 Ivan
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
No jestli je to do skoly, tak ... Ale v praxi bych udelal: create materialized view table_copy as select * from table;

begin dbms_mview.refresh('TABLE_COPY'); end;

To co po tobe chteji je pouziti dynamickyho SQL v procedure. Bohuzel zrovna tohle je dost nestasny pouziti, kterymu by ses mel obloukem vyhnout.
11.11.2009 08:41 kulik
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
To je naprosty nesmysl. To, ze je jmeno tabulky pouzite v execute immediate, nevytvari zadnou zavislost procedury na tabulce. Tento zpusob osetreni databazovych objektu se bezne pouziva, je to trivialni programatorsky postup - co chci delat opakovane (mit to pod kontrolou, logovat to,...), vytahnu si do funkce. Samozrejme aplikace provadejici DDL nejsou typicke, ale napriklad v datovych skladech jde o velmi casty postup - vytvoreni a zruseni pomocnych tabulek, truncate stage tabulek, exchange partition,... jsou vsechno velmi smysluplne DDL operace. Moudro "Obecne plati, ze v Oracle by nikdy nemely volat DDL na produkcnim systemu" je od tebe nebo jsi ho nekde vycetl (v takovem pripade by me hodne zajimalo kde).
11.11.2009 09:55 tascoa | skóre: 11
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
neexistuje neco jako:

create table tab_copy as desc tab_orig;

??? nikde jsem to nevycetl...
11.11.2009 10:40 melkors | skóre: 13 | blog: kdo_chce_kam
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
create table KOPIE as select * from ORIG;
11.11.2009 11:38 kulik
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
Pripadne s podminkou typu where 1 = 2, pokud chci jen stejne sloupecky bez dat. Nevylucuju ze na to existuje vhodna funkce v nektrem z dbms* baliku, ale ja jsem zvykly to delat takhle.
13.2.2011 10:01 AZOR
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
Je na to dbms_metadata.get_dll , ktera vrati kazde ddl z objektu. Ale normalni clovek pouziv select * from samicky where 1=23;
11.11.2009 13:22 Ivan
Rozbalit Rozbalit vše Re: Vytvoření tabulky v PL-SQL proceduře
Takhle zavislost na tabulce samozrejme nevznikne, ale pak tuhle proceduru nemuzete volat z cehokoliv co na te tabulce zavisi. Nekdy to muze byt docela orisek, prijit na to co invaliduje proceduru, kterou volate. Truncate a partition management jsou samozrejme operace ktere do produkce patri. Pokud ale nekdo neumi napsat poradne join a resi to tak, ze si dropne pomocnou tabulku, pak ji zase vytvori a pak se ji pokusi pouzit v nejakym dotazu, tak ma proste na Oracle smulu. Takovyhle postupy se daji pouzit tak na Accessu nebo na MySQL. Takze mate pravdu to "mourdo" musim vzit zpet, ale mam jine - produkci be se melo provatet co nejmene operaci ktere vyzaduji library cache pin. A treba to dropnuti a znovu vytvoreni tabulky vyzaduje rekompilaci vsech PL/SQL procedur, ktere na ni zavisi.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.