Create table in Procedure

前端 未结 4 938
旧时难觅i
旧时难觅i 2020-12-12 00:48

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?



        
相关标签:
4条回答
  • 2020-12-12 01:20

    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;
    
    0 讨论(0)
  • 2020-12-12 01:21

    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;
    
    0 讨论(0)
  • 2020-12-12 01:28

    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.

    0 讨论(0)
  • 2020-12-12 01:31
    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;
    
    0 讨论(0)
提交回复
热议问题