【问题标题】:insert into table1 select * from another table2 , then delete the row from table2插入 table1 select * from another table2 ,然后从 table2 中删除行
【发布时间】:2017-07-05 11:10:51
【问题描述】:

我正在尝试将行插入 table1 select * from table2,最后使用 oracle sql developer 中的函数从 table2 中删除行。我不知道该怎么做。

以下是我的功能:

create or replace FUNCTION DELETEROW(GODOWN_DIST_CODE IN 
TEST_TABLE.GODOWN_DIST_CODE%TYPE)  return varchar2
AS
returned_value varchar2(50);
BEGIN
begin
INSERT INTO TEST_TABLE_BACKUP SELECT * FROM TEST_TABLE WHERE 
GODOWN_DIST_CODE=GODOWN_DIST_CODE;
DELETE TEST_TABLE WHERE GODOWN_DIST_CODE = GODOWN_DIST_CODE;

INSERT INTO NEW_TABLE_BACKUP SELECT * FROM NEW_TABLE WHERE GODOWN_DIST_CODE 
= GODOWN_DIST_CODE;
DELETE FROM NEW_TABLE WHERE GODOWN_DIST_CODE = GODOWN_DIST_CODE;

exception
 WHEN no_data_found THEN
      returned_value := '#';
end;
RETURN returned_value;    
END;

【问题讨论】:

  • 向观众展示您迄今为止尝试过的无效或错误结果。
  • can notPROCEDURE 中使用 RETURN。如果你想返回一些东西,你需要创建FUNCTIONFUNCTIONPROCEDURE 是两个不同的东西。
  • @XING,我已经创建了上面的函数,当我执行该函数时,所有行都被插入到 TEST_TABLE_BACKUP 和 NEW_TABLE_BACKUP ,但是我正在传递带有一些值的参数并将其用作 where 条件,甚至所有记录正在被删除。
  • @KeyurPanchal,我更新了我的函数,当我使用参数执行函数时,所有行都插入到备份表并从主表中删除所有行,但不使用 where cluase,可以请告诉我我做错了什么。
  • @BharathPateru。当您的需求需要PROCEDURE 时,您为什么还要关注FUNCTION。我们通常在需要一些计算或希望返回一些逻辑或布尔值的地方使用函数。您可以按照以下示例中显示的内容进行操作。

标签: sql oracle function stored-procedures plsql


【解决方案1】:

根据我们的讨论,我为您提出了这个解决方案。尽管我发现不需要FUNCTION 我使用FUNCTION 显示示例。此外,我已将您的删除逻辑写入Procedure,根据删除语句的成功,Return 值被捕获在变量var 中,并作为您可以使用的 OUT paramater 发送。

功能:

CREATE OR REPLACE FUNCTION confirm_ckh
   RETURN VARCHAR
AS
BEGIN
   RETURN ('#');
END;

程序:

CREATE OR REPLACE PROCEDURE DELETEROW (
   GODOWN_DIST_CODE   IN TEST_TABLE.GODOWN_DIST_CODE%TYPE,
   var OUT varchar2) <-- Out parameter to get the return value
AS

BEGIN
   BEGIN
      INSERT INTO TEST_TABLE_BACKUP
         SELECT *
           FROM TEST_TABLE
          WHERE GODOWN_DIST_CODE = GODOWN_DIST_CODE;

      IF SQL%ROWCOUNT > 0
      THEN
         DBMS_OUTPUT.put_line ('Insert Success TEST_TABLE_BACKUP');
         var:=confirm_ckh;
      END IF;

      DELETE TEST_TABLE
       WHERE GODOWN_DIST_CODE = GODOWN_DIST_CODE;

      IF SQL%ROWCOUNT > 0
      THEN
         DBMS_OUTPUT.put_line ('Deleted records from TEST_TABLE ');
         var:=confirm_ckh;
      END IF;


      INSERT INTO NEW_TABLE_BACKUP
         SELECT *
           FROM NEW_TABLE
          WHERE GODOWN_DIST_CODE = GODOWN_DIST_CODE;

      IF SQL%ROWCOUNT > 0
      THEN
         DBMS_OUTPUT.put_line ('Insert Success for NEW_TABLE_BACKUP');
         var:=confirm_ckh;
      END IF;

      DELETE FROM NEW_TABLE
            WHERE GODOWN_DIST_CODE = GODOWN_DIST_CODE;

      IF SQL%ROWCOUNT > 0
      THEN
         DBMS_OUTPUT.put_line ('Deleted records from NEW_TABLE ');
         var:=confirm_ckh;
      END IF;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         null;
   END;
END;

【讨论】:

    【解决方案2】:

    试试这个:-

    CREATE OR REPLACE PROCEDURE TABLE2_TO_TABLE1
      IS
      BEGIN
        EXECUTE IMMEDIATE 'INSERT INTO TABLE1(
                  Field1,
                  Field2,
                  Field3
                  )
                SELECT Field1,
                      Field2,
                      Field3
                      FROM TABLE2';
        EXECUTE IMMEDIATE 'DELETE TABLE2 where rownum != 0';
     END TABLE2_TO_TABLE1;
    

    执行程序

    BEGIN
        TABLE2_TO_TABLE1;
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 2014-06-17
      • 2019-04-08
      • 1970-01-01
      • 2021-04-07
      • 2012-06-08
      相关资源
      最近更新 更多