oracle存储过程for in loop的问题

Posted

tags:

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

--for in loop循环create or replace procedure test_ForInLoop() ascursor test_cursor is select w_name from work_oracle_test;w_name varchar2;begin       for w_name in test_cursor loop       begin           dbms_output.put_line(w_name);       end;       end loop;end testForInLoop;这段代码哪里错了?请高手赐教。

ascursor 应该是as cursor
w_name varchar2 这点应该声明数据类型的大小,如:varchar2(50);同时变量名最好不要和字段名同名。
begin dbms_output.put_line(w_name); end; 这儿可以不用写begin end;直接写dbms_output.put_line(w_name);
如:
CREATE OR REPLACE PROCEDURE TEST_FORINLOOP() AS
CURSOR TEST_CURSOR IS
SELECT W_NAME FROM WORK_ORACLE_TEST;
V_NAME WORK_ORACLE_TEST%Rowtype;
BEGIN
FOR V_NAME IN TEST_CURSOR LOOP
DBMS_OUTPUT.PUT_LINE(V_NAME);
END LOOP;
END TESTFORINLOOP;
也可以:
CREATE OR REPLACE PROCEDURE TEST_FORINLOOP() AS
CURSOR TEST_CURSOR IS
SELECT W_NAME FROM WORK_ORACLE_TEST;
V_NAME VARCHAR2(50);
BEGIN
FOR V_NAME IN TEST_CURSOR LOOP
DBMS_OUTPUT.PUT_LINE(V_NAME);
END LOOP;
END TESTFORINLOOP;
参考技术A 你定义过程的时候能用循环吗?
create or replace procedure test_ForlnLoop() is
cursor test_cursor is select w_name from work_oracle_test;
begin
for w_name in test_cursor loop
dbms_output.put_line(w_name);
end loop;
end;
似乎你的那个w_name 是不用声明的,可以在for里直接使用。
参考技术B create or replace procedure test_ForInLoop()
as
cursor test_cursor is select w_name from work_oracle_test;
w_name varchar2;
begin
open test_cursor;
loop

fetch test_cursor into w_name;
EXIT WHEN test_cursor%NOTFOUND;

dbms_output.put_line(w_name);
end loop;
close test_cursor;

end ;
参考技术C w_name varchar2改成w_name varchar2(20)

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存储过程for in loop的问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程中循环for in是如何使用的

oracle存储过程中循环for in是如何使用的

oracle 跳出一个循环的问题

如何解决oracle存储过程select into问题

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

Oracle存储过程中,查询结果有多行如何赋值