可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have created the table "Risiko" which shouldntbe dynamic, i tought it would be that simple but it was not. How should i solve it? and what am i doing wrong?
CREATE OR REPLACE PROCEDURE TABLERISIKO IS
BEGIN
drop table risiko;
CREATE TABLE Risiko
(
RNr INTEGER,
Projekt INTEGER,
Text VARCHAR(25),
Gruppe INTEGER,
Auswirkung INTEGER,
WKeit INTEGER,
Pruefdatum DATE,
PRIMARY KEY (RNr),
CONSTRAINT FKRisiko1 FOREIGN KEY (Projekt)
REFERENCES Projekt(ProNr),
CONSTRAINT FKRisiko2 FOREIGN KEY (Gruppe)
REFERENCES Risikogruppe (RGNr),
CONSTRAINT PosAuswirkung CHECK(Auswirkung >=0),
CONSTRAINT WKeitProzent CHECK(WKeit>=0 AND WKeit<=100)
);
INSERT INTO Risiko
VALUES(1,1,'Anforderungenunklar',1,50000,30
,TO_DATE('25.01.06','DD.MM.YY'));
INSERT INTO Risiko
VALUES(2,1,'Abnahmeprozess offen',2,30000,70
,TO_DATE('26.02.06','DD.MM.YY'));
INSERT INTO Risiko
VALUES(3,2,'Ansprechpartner wechseln',1,20000,80
,TO_DATE('06.05.06','DD.MM.YY'));
INSERT INTO Risiko
VALUES(4,2,'neue Entwicklungsumgebung',3,40000,20
,TO_DATE('05.10.06','DD.MM.YY'));
END;
Thanks for help
回答1:
Because we can't write DDL statements directly in PL/SQL block, for example when we write
CREATE OR REPLACE PROCEDURE TABLERISIKO IS
BEGIN
drop table risiko;
CREATE TABLE Risiko
(
RNr INTEGER,
Projekt INTEGER,
Text VARCHAR(25),
Gruppe INTEGER,
Auswirkung INTEGER,
WKeit INTEGER,
Pruefdatum DATE,
PRIMARY KEY (RNr),
CONSTRAINT FKRisiko1 FOREIGN KEY (Projekt)
REFERENCES Projekt(ProNr),
CONSTRAINT FKRisiko2 FOREIGN KEY (Gruppe)
REFERENCES Risikogruppe (RGNr),
CONSTRAINT PosAuswirkung CHECK(Auswirkung >=0),
CONSTRAINT WKeitProzent CHECK(WKeit>=0 AND WKeit<=100)
);
INSERT INTO Risiko VALUES(1,1,'Anforderungenunklar',1,50000,30 ,TO_DATE('25.01.06','DD.MM.YY'));
INSERT INTO Risiko VALUES(2,1,'Abnahmeprozess offen',2,30000,70 ,TO_DATE('26.02.06','DD.MM.YY'));
INSERT INTO Risiko VALUES(3,2,'Ansprechpartner wechseln',1,20000,80 ,TO_DATE('06.05.06','DD.MM.YY'));
INSERT INTO Risiko VALUES(4,2,'neue Entwicklungsumgebung',3,40000,20 ,TO_DATE('05.10.06','DD.MM.YY'));
END;
It will not work But,
CREATE OR REPLACE PROCEDURE TABLERISIKO IS
BEGIN
execute immediate 'drop table risiko';
execute immediate 'CREATE TABLE Risiko
(
RNr INTEGER,
Projekt INTEGER,
Text VARCHAR(25),
Gruppe INTEGER,
Auswirkung INTEGER,
WKeit INTEGER,
Pruefdatum DATE,
PRIMARY KEY (RNr),
CONSTRAINT FKRisiko1 FOREIGN KEY (Projekt)
REFERENCES Projekt(ProNr),
CONSTRAINT FKRisiko2 FOREIGN KEY (Gruppe)
REFERENCES Risikogruppe (RGNr),
CONSTRAINT PosAuswirkung CHECK(Auswirkung >=0),
CONSTRAINT WKeitProzent CHECK(WKeit>=0 AND WKeit<=100)
)';
execute immediate '
INSERT INTO Risiko VALUES(1,1,||'''||'Anforderungenunklar'||'''||,1,50000,30 ,TO_DATE(||'''||'25.01.06'||'''||,||'''||'DD.MM.YY'||'''||));
INSERT INTO Risiko VALUES(2,1,||'''||'Abnahmeprozess offen'||'''||,2,30000,70 ,TO_DATE(||'''||'26.02.06'||'''||,||'''||'DD.MM.YY'||'''||));
INSERT INTO Risiko VALUES(3,2,||'''||'Ansprechpartner wechseln'||'''||,1,20000,80 ,TO_DATE(||'''||'06.05.06'||'''||,||'''||'DD.MM.YY'||'''||));
INSERT INTO Risiko VALUES(4,2,||'''||'neue Entwicklungsumgebung'||'''||,3,40000,20 ,TO_DATE(||'''||'05.10.06'||'''||,||'''||'DD.MM.YY'||'''||))';
commit;
END;
It will run successfully.
回答2:
You need to use execute immediate
and probably commit
the changes at the end.
CREATE OR REPLACE PROCEDURE TABLERISIKO IS
BEGIN
execute immediate 'drop table risiko';
execute immediate 'CREATE TABLE Risiko
(
RNr INTEGER,
Projekt INTEGER,
Text VARCHAR(25),
Gruppe INTEGER,
Auswirkung INTEGER,
WKeit INTEGER,
Pruefdatum DATE,
PRIMARY KEY (RNr),
CONSTRAINT FKRisiko1 FOREIGN KEY (Projekt)
REFERENCES Projekt(ProNr),
CONSTRAINT FKRisiko2 FOREIGN KEY (Gruppe)
REFERENCES Risikogruppe (RGNr),
CONSTRAINT PosAuswirkung CHECK(Auswirkung >=0),
CONSTRAINT WKeitProzent CHECK(WKeit>=0 AND WKeit<=100)
)';
execute immediate 'INSERT INTO Risiko
VALUES(1,1,''Anforderungenunklar'',1,50000,30
,TO_DATE(''25.01.06'',''DD.MM.YY''))';
execute immediate 'INSERT INTO Risiko
VALUES(2,1,''Abnahmeprozess offen'',2,30000,70
,TO_DATE(''26.02.06'',''DD.MM.YY''))';
execute immediate 'INSERT INTO Risiko
VALUES(3,2,''Ansprechpartner wechseln'',1,20000,80
,TO_DATE(''06.05.06'',''DD.MM.YY''))';
execute immediate 'INSERT INTO Risiko
VALUES(4,2,''neue Entwicklungsumgebung'',3,40000,20
,TO_DATE(''05.10.06'',''DD.MM.YY''))';
commit;
END;
回答3:
Like this it works, just did the secon part like the first. Thanks for the help guys.
CREATE OR REPLACE PROCEDURE TABLERISIKO IS
BEGIN
execute immediate 'drop table risiko';
execute immediate 'CREATE TABLE Risiko
(
RNr INTEGER,
Projekt INTEGER,
Text VARCHAR(25),
Gruppe INTEGER,
Auswirkung INTEGER,
WKeit INTEGER,
Pruefdatum DATE,
PRIMARY KEY (RNr),
CONSTRAINT FKRisiko1 FOREIGN KEY (Projekt)
REFERENCES Projekt(ProNr),
CONSTRAINT FKRisiko2 FOREIGN KEY (Gruppe)
REFERENCES Risikogruppe (RGNr),
CONSTRAINT PosAuswirkung CHECK(Auswirkung >=0),
CONSTRAINT WKeitProzent CHECK(WKeit>=0 AND WKeit<=100)
)';
commit;
execute immediate '
INSERT INTO Risiko
VALUES(1,1,||'''||'Anforderungenunklar'||'''||,1,50000,30
,TO_DATE(||'''||'25.01.06'||'''||,||'''||'DD.MM.YY'||'''||));
INSERT INTO Risiko
VALUES(2,1,||'''||'Abnahmeprozess offen'||'''||,2,30000,70
,TO_DATE(||'''||'26.02.06'||'''||,||'''||'DD.MM.YY'||'''||));
INSERT INTO Risiko
VALUES(3,2,||'''||'Ansprechpartner wechseln'||'''||,1,20000,80
,TO_DATE(||'''||'06.05.06'||'''||,||'''||'DD.MM.YY'||'''||));
INSERT INTO Risiko
VALUES(4,2,||'''||'neue Entwicklungsumgebung'||'''||,3,40000,20
,TO_DATE(||'''||'05.10.06'||'''||,||'''||'DD.MM.YY'||'''||))';
commit;
END;
回答4:
CREATE OR REPLACE PROCEDURE TABLERISIKO ( in_table_name user_tables.table_name%TYPE) IS
l_table_exists PLS_INTEGER;
l_table_name user_tables.table_name%TYPE;
BEGIN
l_table_name := 'RISIKO';
SELECT COUNT ( *)
INTO l_table_exists
FROM user_tables
WHERE table_name = l_table_name;
IF l_table_exists = 1 THEN
EXECUTE IMMEDIATE 'DROP TABLE ' || l_table_name;
END IF;
EXECUTE IMMEDIATE
'CREATE TABLE ' || l_table_name || '
(
RNr INTEGER,
Projekt INTEGER,
Text VARCHAR(25),
Gruppe INTEGER,
Auswirkung INTEGER,
WKeit INTEGER,
Pruefdatum DATE,
PRIMARY KEY (RNr),
CONSTRAINT FK' || l_table_name || '1 FOREIGN KEY (Projekt)
REFERENCES Projekt(ProNr),
CONSTRAINT FK' || l_table_name || '2 FOREIGN KEY (Gruppe)
REFERENCES ' || l_table_name || 'gruppe (RGNr),
CONSTRAINT PosAuswirkung CHECK(Auswirkung >=0),
CONSTRAINT WKeitProzent CHECK(WKeit>=0 AND WKeit<=100)
)';
EXECUTE IMMEDIATE 'INSERT INTO ' || l_table_name || ' VALUES (1, 1, ''Anforderungenunklar'', 1, 50000, 30, TO_DATE ( ''25.01.06'', ''DD.MM.YY2''))';
EXECUTE IMMEDIATE 'INSERT INTO ' || l_table_name || ' VALUES (2, 1, ''Abnahmeprozess offen'', 2, 30000, 70, TO_DATE ( ''26.02.06'', ''DD.MM.YY''))';
EXECUTE IMMEDIATE 'INSERT INTO ' || l_table_name || ' VALUES (3, 2, ''Ansprechpartner wechseln'', 1, 20000, 80, TO_DATE ( ''06.05.06'', ''DD.MM.YY''))';
EXECUTE IMMEDIATE 'INSERT INTO ' || l_table_name || ' VALUES (4, 2, ''neue Entwicklungsumgebung'', 3, 40000, 20, TO_DATE ( ''05.10.06'', ''DD.MM.YY''))';
COMMIT;
END;
BEGIN
TABLERISIKO ( 'RISKO');
END;
SELECT * FROM risko;