现在的问题就是怎么把这些记录作为结果集返回啊??
10 个解决方案
#1
这个 可以在程序里面一行一行读取保存 实例化类保存数据
#2
在程序中保存的话,就是要把存储过程中的循环拿到程序中,每次都传递一个ID去查询,然后返回保存,这样是不是就要多次去连接数据库读取数据?能一次获取出来吗?
#3
自定义类型
create or replace type myRow is object (id int,name varchar(20));
create or replace type myTable is table of myRow;
create or replace procedure testProcedure(p_mytable out myTable)
as
v_myrow myRow := myRow(null,null);
begin
p_mytable := myTable();
v_myrow.id := 100;
v_myrow.name := 'a';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
v_myrow.id := 200;
v_myrow.name := 'b';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
v_myrow.id := 300;
v_myrow.name := 'c';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
end testProcedure;
create or replace type myRow is object (id int,name varchar(20));
create or replace type myTable is table of myRow;
create or replace procedure testProcedure(p_mytable out myTable)
as
v_myrow myRow := myRow(null,null);
begin
p_mytable := myTable();
v_myrow.id := 100;
v_myrow.name := 'a';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
v_myrow.id := 200;
v_myrow.name := 'b';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
v_myrow.id := 300;
v_myrow.name := 'c';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
end testProcedure;
#4
定义一个数组,把值放到数组里,然后返回
#5
SQL> create or replace function f_test return dbms_sql.Varchar2_Table as
2 v_ename_table dbms_sql.Varchar2_Table;
3 begin
4 select ename bulk collect into v_ename_table from emp;
5 return v_ename_table;
6 end;
7 /
Function created
SQL>
SQL> set serveroutput on;
SQL> declare
2 v_ename_table dbms_sql.Varchar2_Table;
3 begin
4 v_ename_table := f_test;
5 for i in 1..v_ename_table.count loop
6 dbms_output.put_line(v_ename_table(i));
7 end loop;
8 end;
9 /
SMIT H1
ALLE N
WARD
JONE S
MART IN
BLAK E
CLAR K
SCOT T
KING
TURN ER
ADAM S
JAME S
FORD
MILL ER
PL/SQL procedure successfully completed
#6
数组就可以了,一次返回。
#7
在procedure中用一个cursor返回需要的结果集,设置一个标记变量,用于fetch 该cursor时记录cursor的状态。将每一次fetch的内容和标记变量同时传出。
在应用程序中循环调用该procedure,通过返回的标记变量判断是否退出该循环。
大致过程如下:
create or replace procedure test(id IN INT, cont OUT VARCHAR2, flg OUT CHAR) IS
CURSOR test_cur(v_id) IS
SELECT ...
flg := '0';
v_record test_cur%TYPE;
begin
IF test_cur IS NOT OPEN THEN
OPEN test_cur(id);
END IF;
IF test_cur IS OPEN THEN
FETCH test_cur
INTO v_record
cont := v_record....
IF test_cur NOT FOUND THEN
flg:='1';
END IF;
END IF;
end test;
DECLARE
flg CHAR;
cont VARCHAR2;
BEGIN
LOOP
test(1,cont,flg);
... --deal with cont
EXIT WHEN flg='1';
END LOOP;
END;
在应用程序中循环调用该procedure,通过返回的标记变量判断是否退出该循环。
大致过程如下:
create or replace procedure test(id IN INT, cont OUT VARCHAR2, flg OUT CHAR) IS
CURSOR test_cur(v_id) IS
SELECT ...
flg := '0';
v_record test_cur%TYPE;
begin
IF test_cur IS NOT OPEN THEN
OPEN test_cur(id);
END IF;
IF test_cur IS OPEN THEN
FETCH test_cur
INTO v_record
cont := v_record....
IF test_cur NOT FOUND THEN
flg:='1';
END IF;
END IF;
end test;
DECLARE
flg CHAR;
cont VARCHAR2;
BEGIN
LOOP
test(1,cont,flg);
... --deal with cont
EXIT WHEN flg='1';
END LOOP;
END;
#8
使用数组
#9
建立一个临时表,然后存储过程里面向临时表里插入数据。
外部程序查询这个临时表就可以了。
外部程序查询这个临时表就可以了。
#10
学习,不过觉得临时表应该也是不错的方式
#1
这个 可以在程序里面一行一行读取保存 实例化类保存数据
#2
在程序中保存的话,就是要把存储过程中的循环拿到程序中,每次都传递一个ID去查询,然后返回保存,这样是不是就要多次去连接数据库读取数据?能一次获取出来吗?
#3
自定义类型
create or replace type myRow is object (id int,name varchar(20));
create or replace type myTable is table of myRow;
create or replace procedure testProcedure(p_mytable out myTable)
as
v_myrow myRow := myRow(null,null);
begin
p_mytable := myTable();
v_myrow.id := 100;
v_myrow.name := 'a';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
v_myrow.id := 200;
v_myrow.name := 'b';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
v_myrow.id := 300;
v_myrow.name := 'c';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
end testProcedure;
create or replace type myRow is object (id int,name varchar(20));
create or replace type myTable is table of myRow;
create or replace procedure testProcedure(p_mytable out myTable)
as
v_myrow myRow := myRow(null,null);
begin
p_mytable := myTable();
v_myrow.id := 100;
v_myrow.name := 'a';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
v_myrow.id := 200;
v_myrow.name := 'b';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
v_myrow.id := 300;
v_myrow.name := 'c';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
end testProcedure;
#4
定义一个数组,把值放到数组里,然后返回
#5
SQL> create or replace function f_test return dbms_sql.Varchar2_Table as
2 v_ename_table dbms_sql.Varchar2_Table;
3 begin
4 select ename bulk collect into v_ename_table from emp;
5 return v_ename_table;
6 end;
7 /
Function created
SQL>
SQL> set serveroutput on;
SQL> declare
2 v_ename_table dbms_sql.Varchar2_Table;
3 begin
4 v_ename_table := f_test;
5 for i in 1..v_ename_table.count loop
6 dbms_output.put_line(v_ename_table(i));
7 end loop;
8 end;
9 /
SMIT H1
ALLE N
WARD
JONE S
MART IN
BLAK E
CLAR K
SCOT T
KING
TURN ER
ADAM S
JAME S
FORD
MILL ER
PL/SQL procedure successfully completed
#6
数组就可以了,一次返回。
#7
在procedure中用一个cursor返回需要的结果集,设置一个标记变量,用于fetch 该cursor时记录cursor的状态。将每一次fetch的内容和标记变量同时传出。
在应用程序中循环调用该procedure,通过返回的标记变量判断是否退出该循环。
大致过程如下:
create or replace procedure test(id IN INT, cont OUT VARCHAR2, flg OUT CHAR) IS
CURSOR test_cur(v_id) IS
SELECT ...
flg := '0';
v_record test_cur%TYPE;
begin
IF test_cur IS NOT OPEN THEN
OPEN test_cur(id);
END IF;
IF test_cur IS OPEN THEN
FETCH test_cur
INTO v_record
cont := v_record....
IF test_cur NOT FOUND THEN
flg:='1';
END IF;
END IF;
end test;
DECLARE
flg CHAR;
cont VARCHAR2;
BEGIN
LOOP
test(1,cont,flg);
... --deal with cont
EXIT WHEN flg='1';
END LOOP;
END;
在应用程序中循环调用该procedure,通过返回的标记变量判断是否退出该循环。
大致过程如下:
create or replace procedure test(id IN INT, cont OUT VARCHAR2, flg OUT CHAR) IS
CURSOR test_cur(v_id) IS
SELECT ...
flg := '0';
v_record test_cur%TYPE;
begin
IF test_cur IS NOT OPEN THEN
OPEN test_cur(id);
END IF;
IF test_cur IS OPEN THEN
FETCH test_cur
INTO v_record
cont := v_record....
IF test_cur NOT FOUND THEN
flg:='1';
END IF;
END IF;
end test;
DECLARE
flg CHAR;
cont VARCHAR2;
BEGIN
LOOP
test(1,cont,flg);
... --deal with cont
EXIT WHEN flg='1';
END LOOP;
END;
#8
使用数组
#9
建立一个临时表,然后存储过程里面向临时表里插入数据。
外部程序查询这个临时表就可以了。
外部程序查询这个临时表就可以了。
#10
学习,不过觉得临时表应该也是不错的方式