Sql insert、update或delete的CASE语句
我已经创建了一个存储过程。在该存储过程中,我需要用于插入、更新或删除的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。你能帮我解决我的问题吗。 谢谢您需要按原样声明您的
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;