在过程

时间:2016-11-04 08:47:26

标签: oracle stored-procedures plsql ddl

我创造了桌子" Risiko"这应该是动态的,我认为它会那么简单,但事实并非如此。我该怎么解决?我做错了什么?

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;

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

您最后需要使用execute immediate并且可能commit更改。

   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;

答案 1 :(得分:0)

因为我们不能直接在PL / SQL块中编写DDL语句,例如当我们编写

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;

它不会起作用但是,

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;

它会成功运行。

答案 2 :(得分:0)

像这样它起作用,就像第一个那样做了secon部分。谢谢你的帮助。

Activity

答案 3 :(得分:0)

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;