Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql insert、update或delete的CASE语句_Sql_Oracle_Plsql_Case - Fatal编程技术网

Sql insert、update或delete的CASE语句

Sql insert、update或delete的CASE语句,sql,oracle,plsql,case,Sql,Oracle,Plsql,Case,我已经创建了一个存储过程。在该存储过程中,我需要用于插入、更新或删除的case语句 If v_var='I' then insert into main_tbl If v_var='D' then delete from main_tbl where <condition> If v_var='U' then update main_tbl set <condition>. 执行此操作后,数据无法加载到主\u tbl。你能帮我解决我的问题吗。 谢谢您需要按原样声明您的

我已经创建了一个存储过程。在该存储过程中,我需要用于插入、更新或删除的case语句

If v_var='I' then insert into main_tbl
If v_var='D' then delete from main_tbl where  <condition>
If v_var='U' then update main_tbl set <condition>.
执行此操作后,数据无法加载到主\u tbl。你能帮我解决我的问题吗。
谢谢

您需要按原样声明您的过程,因此第一行缺少一个关键字:

create or replace PROCEDURE sp_cs
当关键字和结束案例时,您缺少

 case when v_var = 'I'
      then insert into main_tbl values (v_rc(i).col1, .....);
      when v_var = 'D'
      then delete from main_tbl m where m.col2=v_rc.col2;
      when v_var = 'U'
      then update main_tbl m set m.col2=v_rc.col2;
 end case;

create过程有几个语法错误,请尝试下面的方法。 另外,看一看

合并可以在一条语句中执行插入、更新和删除操作

CREATE OR REPLACE PROCEDURE sp_cs
IS
   v_var   txt.col1%TYPE;

   TYPE record IS REF CURSOR
      RETURN txt%ROWTYPE;                                      --Staging table

   v_rc    record;

   CURSOR c1
   IS
      SELECT * FROM txt;
BEGIN
   OPEN c1;

   LOOP
      FETCH c1 INTO v_rc;

      FOR i IN 1 .. v_rc.COUNT
      LOOP
         CASE
            WHEN v_var = 'I'
            THEN
               INSERT INTO main_tbl
                    VALUES (v_rc (i).col1);
            WHEN v_var = 'D'
            THEN
               DELETE FROM main_tbl m
                     WHERE m.col2 = v_rc.col2;
            WHEN v_var = 'U'
            THEN
               UPDATE main_tbl m
                  SET m.col2 = v_rc.col2;
         END CASE;
      END LOOP;
   END LOOP;

   CLOSE c1;
END;

嗯,
打开..获取..循环
已经相当过时了。您只需使用基于参数的单insert/update/delete语句,它将比您的循环构造更有效

CREATE OR replace PROCEDURE sp_cs (p_var txt.col1%TYPE) 
IS 
BEGIN 
    CASE p_var 
      WHEN 'I' THEN 
        INSERT INTO main_tbl 
        SELECT * 
        FROM   txt; 
      WHEN 'D' THEN 
        DELETE FROM main_tbl m 
        WHERE  EXISTS (SELECT 1 
                       FROM   txt t 
                       WHERE  m.col2 = t.col2); 
      WHEN 'U' THEN 
        UPDATE main_tbl m 
        SET    m.col2 = (SELECT v_rc.col2 
                         FROM   txt 
                         WHERE  m.somecol = t.somecol); -- the column you want to compare while updating
    END CASE; 
END; 

/ 

虽然您的更新查询不清楚您想要实现什么,但我假设您在从
main\u tbl
更新col2时在
txt
中有一个公共列。此外,我将您的参数用作过程参数
p\u var
。如果不想传递它,可以将其用作局部变量。

这里需要ref cur吗?如果没有,那么试试这个

create or replace procedure sp_cs 
as
    cursor c1 is select * from txt;
    rc c1%rowtype;
begin
    For c in rc Loop
        case c.col1 
            When 'I' Then
                insert into main_tbl values (c.col1, .....);
            When 'U' Then
                update main_tbl m set m.col2=c.col2;
            When 'D'
                delete from main_tbl m where m.col2=c.col2;
        End Case;
    End Loop;
end;

关键字丢失时,
,两次。还有一个
end
。@jarlh我已经完成了,但仍然遇到同样的问题。
create or replace sp_cs
实际上是
create or replace procedure sp_cs as
在您的真实代码中吗?循环永远不会退出,因为当c1%notfound
时没有
exit来检查光标状态(尽管正常的操作会使这变得简单得多)。此外,
v_var
从未设置为任何值。另外,
v_rc
是一个记录而不是数组,因此不能有任何
v_rc.count
v_rc(i)
。您没有为v_var设置任何值。在这种情况下,它默认为null。因此,案例陈述从未得到满足。
create or replace procedure sp_cs 
as
    cursor c1 is select * from txt;
    rc c1%rowtype;
begin
    For c in rc Loop
        case c.col1 
            When 'I' Then
                insert into main_tbl values (c.col1, .....);
            When 'U' Then
                update main_tbl m set m.col2=c.col2;
            When 'D'
                delete from main_tbl m where m.col2=c.col2;
        End Case;
    End Loop;
end;