oracle存储过程select语句必须带into吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle存储过程select语句必须带into吗相关的知识,希望对你有一定的参考价值。

存储过程select语句必须带into吗
好像sql server可以啊。我看到的例子:
CREATE PROCEDURE dbo.GetProductsByCategory ( @CategoryID int ) AS SELECT * FROM Products WHERE CategoryID = @CategoryID怎么回事

oracle存储过程select语句必须带into。因为要将查询结果放到变量中,如以下存储过程:

create or replace procedure p_test
as
v_begintime varchar2(20);
v_endtime varchar2(20);
v_str varchar2(10);
begin
  v_begintime:=to_char(sysdate,\'yyyy-mm-dd hh24:mi:ss\');
  select \'badkano\' into v_str from dual;
  v_endtime:=to_char(sysdate,\'yyyy-mm-dd hh24:mi:ss\');
  dbms_output.put_line(\'开始时间为:\'||v_begintime);
  dbms_output.put_line(\'结束时间为:\'||v_endtime);
end;

其中select \'badkano\' into v_str from dual;此句就是将“badkano”放入变量“v_str”中。

参考技术A 是的,在存储过程中也不可能有单独查询而不返回结果的情况啊。
所以必须使用INTO子句返回一个结果,以便在存储过程中使用它。追问

好像sql server可以啊。我看到的例子:
CREATE PROCEDURE dbo.GetProductsByCategory ( @CategoryID int ) AS SELECT * FROM Products WHERE CategoryID = @CategoryID怎么回事

追答

sqlserver没接触过啊,不过我想,那大概是获取结果集的方法。
在ORACLE中不能如此获得结果集,所以不一样的。

本回答被提问者和网友采纳
参考技术B 如果是传值的话 必须into
如果想得到 结果的话 可以 在查询前 使用 open result for 查出结果追问

好像sql server可以啊。我看到的例子:
CREATE PROCEDURE dbo.GetProductsByCategory ( @CategoryID int ) AS SELECT * FROM Products WHERE CategoryID = @CategoryID怎么回事

参考技术C 不是啊,语法有问题,干脆不用 VV,试试这个:
SELECT * FROM "T_SBRECORD_copy" WHERE SB_ID=(SELECT SB_ID FROM "T_SBRECORD_copy" WHERE SB_ID=spName);追问

其实是提示:
select * from T_SBRECORD_copy where sb_id=vv那句错误

追答

对了,是想用存储过程返回一张表吗?
那把select * from T_SBRECORD_copy where sb_id=vv这句改成:
exec("select * from T_SBRECORD_copy where sb_id="+vv)

oracle 在sql>状态下 执行insert into select 正常 将这一段复制到存储过程中 再EXEC 就很慢

就是说在一般的命令窗口中insert into select 很正常
但是将这段sql写到存储过程中(包含其他内容)
然后执行存储过程就非常慢(注释掉正常)
数据库是有归档的

现采取其他的方式间接解决了

在command下执行快,有可能是你之前执行过select语句,以至于数据库缓存中有现成的语句执行计划分析报告,所以,单句执行时就快一些,但在存储过程中,oracle是整个存储过程一起硬解析的,所以,会慢。
一般来说,既然写了存储过程就不要用这种简写语句,这种写法通用性低,效率也低。
参考技术A 可以描述的清楚一点吗?

以上是关于oracle存储过程select语句必须带into吗的主要内容,如果未能解决你的问题,请参考以下文章

关于oracle存储过程select into 未找到数据问题

关于oracle存储过程select into 未找到数据问题

请教关于oracle中写存储过程时 select into 语句报错的问题

oracle 中SQL 语句开发语法 SELECT INTO含义

oracle 函数中能调用存储过程吗

oracle 在sql>状态下 执行insert into select 正常 将这一段复制到存储过程中 再EXEC 就很慢