Sql 插入到表1中从另一个表2中选择*,然后从表2中删除该行

Sql 插入到表1中从另一个表2中选择*,然后从表2中删除该行,sql,oracle,function,stored-procedures,plsql,Sql,Oracle,Function,Stored Procedures,Plsql,我正在尝试使用oracle sql developer中的函数将行插入表1,从表2中选择*并最终从表2中删除行。我不知道怎么做 以下是我的职责: 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_B

我正在尝试使用oracle sql developer中的函数将行插入表1,从表2中选择*并最终从表2中删除行。我不知道怎么做

以下是我的职责:

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;
试试这个:-

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;
/

根据我们的讨论,我为您提出了这个解决方案。尽管我觉得没有必要使用
函数
但我还是用
函数
展示了exmaple。我还将您的删除逻辑写入了一个
过程
,根据delete语句的成功与否,变量
var
中包含一个
Return
值,并作为您可以使用的
参数发送出去

功能:

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;
创建或替换过程DELETEROW(
测试表中的仓库区代码。仓库区代码%TYPE,
var OUT varchar2)0
然后
DBMS_OUTPUT.put_行(“插入成功测试_表_备份”);
var:=确认_ckh;
如果结束;
删除测试表
其中仓库区代码=仓库区代码;
如果SQL%ROWCOUNT>0
然后
DBMS_OUTPUT.put_行(“从测试表中删除的记录”);
var:=确认_ckh;
如果结束;
插入到新的\u表\u备份中
挑选*
从新表
其中仓库区代码=仓库区代码;
如果SQL%ROWCOUNT>0
然后
DBMS_OUTPUT.put_line('Insert Success for NEW_TABLE_BACKUP');
var:=确认_ckh;
如果结束;
从新表中删除
其中仓库区代码=仓库区代码;
如果SQL%ROWCOUNT>0
然后
DBMS_OUTPUT.put_行(“从新_表中删除的记录”);
var:=确认_ckh;
如果结束;
例外情况
当找不到数据时
然后
无效的
结束;
结束;

向观众展示您迄今为止尝试过的不起作用或给出错误结果的内容。您不能使用
返回
内部
过程
。如果要返回某些内容,则需要创建
函数
<代码>函数
过程
是两件不同的事情。@XING,我创建了上面的函数,当我执行该函数时,所有的行都被插入以测试表备份和新表备份,但我用一些值传递参数并将其用作where条件,甚至所有记录都被删除。@KeyurPanchal,我已经更新了我的函数,当我使用参数“所有行都将插入备份表”执行函数时,并从主表中删除所有行,但不使用where CLUSE,您能告诉我我犯了什么错误吗?@BharathPateru。当您的需求需要一个
过程时,您为什么要追求
功能
。我们通常在需要计算或需要返回逻辑或布尔值的地方使用函数。您可以按照下面的示例进行操作。