我是oracle的新手,我正在尝试在oracle中创建一个具有select查询的程序 内部更新查询。基于我传递给过程的ID,它应首先执行select语句并将结果传递给本地声明的变量,我通过发送变量值来更新表; 这是一个例子:
CREATE OR REPLACE PROCEDURE DB_TEMP.SP_INSERT_PROF (PID in number)
AS
V1 number;
V2 VARCHAR2(250 BYTE);
V3 VARCHAR2(100 BYTE);
V4 VARCHAR2(100 BYTE);
Begin
Select R1 into v1, r2 into v2, (select * from (select r3 into v3 from table2 where C1=PID) rownum=1),
R4 into v4 from table1 where c2=PID;
If PID is not null then
Begin
Update result_table set R1=v1,r2=v2,r3=v3,r4=v4 where c3=PID;
End if;
End;
/
当我尝试保存时,我收到以下错误:
1)PL / SQL:ORA-00923:未找到FROM关键字 这个错误我在R2查询到v2之前进入命令 2)忽略SQL语句 我在更新命令时得到了这个 3)遇到符号" IF"当期待以下之一时: ; 如果命令,我正在结束。
有人可以帮我解决这个问题吗? 谢谢, 阿尼尔
答案 0 :(得分:0)
您的select
应该有一个into
,而不是每个值一个begin
。而且,if
中还有end
个额外的CREATE OR REPLACE PROCEDURE DB_TEMP.SP_INSERT_PROF (PID in number)
AS
v1 number;
v2 varchar2(250 BYTE);
v3 varchar2(100 BYTE);
v4 varchar2(100 BYTE);
begin
select r1, r2, (
select r3
from (select r3 from table2 where c1=PID order by c2 desc)
where rownum=1), r4
into v1, v2, v3, v4
from table1
where c2=PID;
if PID is not null then
update result_table set r1=v1, r2=v2, r3=v3, r4=v4
where c3=PID;
end if;
end;
/
,您不会使用自己的if
完成。所以它应该是:
select
但是如果PID为空,似乎允许来自table1
,那么c2
就不会在r3
中找到任何行,所以你就可以了得到一个没有数据的异常。如果{{1}}不是唯一的,那么您可能会遇到太多行异常。而获取{{1}}的子选择可能可以作为连接来完成。
您也不需要单独选择和更新;你可以做一个相关的更新,并完全避免使用PL / SQL,但这有点超出了问题的范围。
正如评论者所说,这些都是非常基本和基本的东西,所以你应该确保你理解它是如何工作的,refer to the documentation或者是一个入门教程 - 在文档和文档中都有很多例子。通过互联网。