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 cursorw_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_testas
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”中。
所以必须使用INTO子句返回一个结果,以便在存储过程中使用它。追问
好像sql server可以啊。我看到的例子:
CREATE PROCEDURE dbo.GetProductsByCategory ( @CategoryID int ) AS SELECT * FROM Products WHERE CategoryID = @CategoryID怎么回事
sqlserver没接触过啊,不过我想,那大概是获取结果集的方法。
在ORACLE中不能如此获得结果集,所以不一样的。
如果想得到 结果的话 可以 在查询前 使用 open result for 查出结果追问
好像sql server可以啊。我看到的例子:
CREATE PROCEDURE dbo.GetProductsByCategory ( @CategoryID int ) AS SELECT * FROM Products WHERE CategoryID = @CategoryID怎么回事
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的问题的主要内容,如果未能解决你的问题,请参考以下文章