在oracle中创建过程时遇到几个错误
我是oracle的新手,我正在尝试在oracle中创建一个过程,该过程将包含一个select查询和 内部的更新查询。根据我传递给过程的ID,它应该首先执行select语句,并将结果传递给本地声明的变量,我正在通过发送变量值更新一个表; 以下是一个例子:在oracle中创建过程时遇到几个错误,oracle,stored-procedures,Oracle,Stored Procedures,我是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(
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在预期出现以下情况时遇到符号:
;
这是我在最后得到的命令
谁能帮我解决这个问题?
谢谢
Anil您的选择应该有一个into,而不是每个值一个into。如果你的if里面有一个额外的开始,你不能用它自己的结束来完成。因此,它应该是:
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;
/
但是如果PID为null(这似乎是if允许的),那么select将在表1中找不到任何行,因此您将得到一个“未找到数据”异常。如果c2不是唯一的,则可能会出现太多行异常。而获取r3的子选择可能作为连接来完成
你也不需要单独的选择和更新;您可以进行相关更新,并完全避免PL/SQL,但这超出了问题的范围
正如评论者所说,这些都是非常基本和基本的东西,所以你应该确保你了解这是如何工作的,或者是一个入门教程——文档和互联网上都有很多例子。我觉得,你显然需要先学习和理解PL/SQL的基础知识,因为你所有的错误都是非常基本的。对我来说,更好地学习理论总是好的。检查手册-它都有文档记录。从这里开始:嗨,Alex,谢谢你的回复,我已经按照你说的做了,现在我在select语句内的子查询中又面临一个问题,我需要使用order by和rownum=1,如下所示。从表2中选择r1,r2,从表2中选择r3,其中c1=PID,rownum=1,按C2描述,从表1中选择r4,从表1中选择v1,v2,v3,v4,其中C2=PID;现在我在order命令中遇到“ORA-00907:缺少右括号”错误。请您帮助我。@user3852515-已更新。您必须在应用rownum筛选器之前对子查询进行排序,这会使情况更加糟糕。