Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
在oracle中创建过程时遇到几个错误_Oracle_Stored Procedures - Fatal编程技术网

在oracle中创建过程时遇到几个错误

在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(

我是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在预期出现以下情况时遇到符号: ; 这是我在最后得到的命令

谁能帮我解决这个问题? 谢谢 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筛选器之前对子查询进行排序,这会使情况更加糟糕。