c存儲過程返回結果集
1. c程序該怎麼樣調用oracle存儲過程並獲取存儲過程中的輸出參數的值
我以前這樣用pro*c 這樣玩的,僅供參考
EXEC sql EXECUTE
DECLARE
lsid varchar2(60);
lss_this_error_code number;
BEGIN
proctest(:ls_name,lsid); --ls_name 輸入參數 lss_id 輸出
:chId := lsid;-- lsid 輸出返回給C變數chId
END;
END-EXEC;
2. C#獲取 sqlserver 存儲過程返回多表數據
返回的時候用dataset就可以,比如你存儲過程這樣寫
select * from A
select * from B
select * from C
select * from D
select * from D
在執行完存儲過程後返回一個dataset
dataset ds = 執行存儲過程
ds.tables[0]就是表A
ds.tables[1]就是表B
ds.tables[2]就是表C
剩下的依次類推.
3. oracle如何執行存儲過程以及如何返回一個table
-- 定義類型
CREATE OR REPLACE TYPE MyTable AS OBJECT(A int, B int, C int);
/
CREATE OR REPLACE TYPE MyTableResult IS TABLE OF MyTable;
/
CREATE OR REPLACE FUNCTION getTestTable return MyTableResult
IS
-- 預期返回結果.
return_Result MyTableResult := MyTableResult();
BEGIN
-- 結果追加一行.
return_Result.EXTEND;
-- 設置結果內容.
return_Result(return_Result.COUNT) := MyTable(A => 1, B=>2, C=>3);
-- 結果追加一行.
return_Result.EXTEND;
-- 設置結果內容.
return_Result(return_Result.COUNT) := MyTable(A => 4, B=>5, C=>6);
-- 結果追加一行.
return_Result.EXTEND;
-- 設置結果內容.
return_Result(return_Result.COUNT) := MyTable(A => 7, B=>8, C=>9);
return return_Result;
END getTestTable;
/
SQL> SELECT
2 A, B, C
3 FROM
4 table( getTestTable() );
A B C
---------- ---------- ----------
1 2 3
4 5 6
7 8 9
SQL>
4. SQL Server 在一個存儲過程中調用另外一個存儲過程獲取返回值,出現報錯
第一種方法: 使用output參數
USE AdventureWorks;
GO
IF OBJECT_ID ( 'Proction.usp_GetList', 'P' ) IS NOT NULL
DROP PROCEDURE Proction.usp_GetList;
GO
CREATE PROCEDURE Proction.usp_GetList @proct varchar(40)
, @maxprice money
, @compareprice money OUTPUT
, @listprice money OUT
AS
SELECT p.name AS Proct, p.ListPrice AS 'List Price'
FROM Proction.Proct p
JOIN Proction.ProctSubcategory s
ON p.ProctSubcategoryID = s.ProctSubcategoryID
WHERE s.name LIKE @proct AND p.ListPrice < @maxprice;
-- Populate the output variable @listprice.
SET @listprice = (SELECT MAX(p.ListPrice)
FROM Proction.Proct p
JOIN Proction.ProctSubcategory s
ON p.ProctSubcategoryID = s.ProctSubcategoryID
WHERE s.name LIKE @proct AND p.ListPrice < @maxprice);
-- Populate the output variable @compareprice.
SET @compareprice = @maxprice;
GO
另一個存儲過程調用的時候:
Create Proc Test
as
DECLARE @compareprice money, @cost money
EXECUTE Proction.usp_GetList '%Bikes%', 700,
@compareprice OUT,
@cost OUTPUT
IF @cost <= @compareprice
BEGIN
PRINT 'These procts can be purchased for less than
$'+RTRIM(CAST(@compareprice AS varchar(20)))+'.'
END
ELSE
PRINT 'The prices for all procts in this category exceed
$'+ RTRIM(CAST(@compareprice AS varchar(20)))+'.'
第二種方法:創建一個臨時表
create proc GetUserName
as
begin
select 'UserName'
end
Create table #tempTable (userName nvarchar(50))
insert into #tempTable(userName)
exec GetUserName
select #tempTable
--用完之後要把臨時表清空
drop table #tempTable--需要注意的是,這種方法不能嵌套。例如:
procere a
begin
...
insert #table exec b
end
procere b
begin
...
insert #table exec c
select * from #table
end
procere c
begin
...
select * from sometable
end
--這里a調b的結果集,而b中也有這樣的應用b調了c的結果集,這是不允許的,
--會報「INSERT EXEC 語句不能嵌套」錯誤。在實際應用中要避免這類應用的發生。
第三種方法:聲明一個變數,用exec(@sql)執行:
1);EXEC 執行SQL語句
declare @rsql varchar(250)
declare @csql varchar(300)
declare @rc nvarchar(500)
declare @cstucount int
declare @ccount int
set @rsql='(select Classroom_id from EA_RoomTime where zc='+@zc+' and xq='+@xq+' and T'+@time+'=''否'') and ClassroomType=''1'''
--exec(@rsql)
set @csql='select @a=sum(teststucount),@b=sum(classcount) from EA_ClassRoom where classroom_id in '
set @rc=@csql+@rsql
exec sp_executesql @rc,N'@a int output,@b int output',@cstucount output,@ccount output--將exec的結果放入變數中的做法
--select @csql+@rsql
--select @cstucount
5. 存儲過程如何把一個結果集放在一張表裡面並返回來
結果集有必要放在表裡面返回來,直接返回遊標就可以了,結果集也可以看作是張表的。
DB2的的解決方案:
1.聲明存儲過程的時候,在聲明之後添加 RESULT SETS 1,表示返回一個結果集,示例如下:
CREATE PROCEDURE YOUPRO(IN P_UserId INTEGER)
LANGUAGE SQL
RESULT SETS 1
------------------------------------------------------------------------
-- SQL 存儲過程(獲取用戶信息)
------------------------------------------------------------------------
P1: BEGIN
--聲明會使用到的參數
.... ....
... .....
2.在存儲過程中聲明一個游標,然後返回,示例如下:
DECLARE C1 CURSOR WITH RETURN FOR SELECT *FROM TABLE;
OPEN C1;
Oracle的解決方案:
1.先定義一個包,示例如下:
create or replace package CursorPackage as
type my_cursor is ref cursor;
end CursorPackage;
2.在存儲過程返回參數使用這個定義的參數,示例如下:
create or replace procere YOUPRO(P_UserId IN NUMBER, C_Return OUT CursorPackage.my_cursor)IS ... ... ..
3.存儲過程中,給返回參數賦值,示例如下:
OPEN C_Return FOR SELECT * FROM TABLE;
Sql Server的解決方案
直接返回SELECT * FROM TABLE,SqlServer中可以直接返回結果。
希望對你有幫助!
6. oracle 存儲過程返回結果集怎麼實現用java如何調用這個存儲過程比如表scott下的emp表
1:首先你需要創建一個包,並定義你返回的游標的類型、存儲過程
create or replace package TEST_PKG is
type cur_emp is REF CURSOR;
procere test_proc (emps out cur_emp);
end TEST_PKG;
2:然後你再創建包體
create or replace package body TEST_PKG is
procere test_proc (emps out cur_emp)
as
begin
open emps for select * from emp;
end test_proc;
end TEST_PKG ;
3,通過JAVA調用
cstmt = conn.prepareCall("{call TEST_PKG .test_proc (?)}");
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.execute();
//獲得結果集
rs = (ResultSet)cstmt.getObject(4);
while(rs.next()){......}
注意:游標類型需要你在連接未關閉之前進行本地持久化,不然連接關閉了就無法解析了哦^-^,如果還不懂可以聯系我!