存儲過程游標參數
A. ORACLE存儲過程里游標的結果集怎麼帶參數
SELECT T.APPLY_USER FROM APPLYINFO T WHERE T.APPLY_ID = APPLY_ID;
這個語句已經寫對了,還有什麼問題?
B. 存儲過程中輸出參數為游標的時候怎麼處理
你的意思是不是要獲取到「當前用戶:user_id」這個的內容,如果是,兩個方式可以解決:
1.通過存儲過程的出參,將「當前用戶:user_id」連接串返回;
比如:
假設你的過程叫,prc_test,在參數列表中增加出參。
create or replace procere prc_test(入參 in 類型, 出參 out 類型) is
begin
-- 邏輯實現
end;
出參就是你要把內容放進去,用來傳值的變數。
2.在過程中保存一張臨時表,然後在java中查出這個臨時表中保存的數據。
定義臨時表table_temp
在過程中
insert into table_temp(msg) values ('當前用戶:' || user_id);
C. cx_Oracle,怎麼調用存儲過程,有一個游標的傳出參數
給你個譽喚滾示例,慶余望鏈橡採納
create or replace FUNCTION contact
(
p_cursor SYS_REFCURSOR,
p_exclude_null VARCHAR2 := 'T',
p_del VARCHAR2 := ','
) RETURN VARCHAR2 IS
l_value VARCHAR2(32767);
l_result VARCHAR2(32767);
BEGIN
LOOP
FETCH p_cursor
INTO l_value;
EXIT WHEN p_cursor%NOTFOUND;
l_result := l_result || p_del || l_value;
END LOOP;
RETURN substr(l_result, 2);
END;
/
DECLARE
l_result VARCHAR2(32767);
BEGIN
SELECT contact(CURSOR (SELECT tname FROM tab WHERE rownum < 10)) INTO l_result FROM al;
dbms_output.put_line(l_result);
END;
D. ORACLE存儲過程中游標作為輸出參數調用時怎麼報錯
你的意思是不是要獲取到「當前用戶:user_id」這個的內容,如果是,兩個方式可以解決:
1.通過存儲過程的出參,將「當前用戶:user_id」連接串返回;
比如:
假設你的過程叫,prc_test,在參數列表中增加出參。
create or replace procere prc_test(入參 in 類型, 出參 out 類型) is
begin
-- 邏輯實現
end;
出參就是你要把內容放進去,用來傳值的變數。
2.在過程中保存一張臨時表,然後在java中查出這個臨時表中保存的數據。
定義臨時表table_temp
在過程中
insert into table_temp(msg) values ('當前用戶:' || user_id);
E. oracle存儲過程的參數游標應該怎樣來賦值
oracle存儲過程的參數游標應該怎樣來賦值
可以使用動態游標。
REF CURSOR 存儲過程中使用 open cursor xxx for select xxx ;
F. 存儲過程中使用游標帶參數的目的是什麼,為什麼不能將參數直接放在procere裡面呢,感覺怪怪的
snowy_howe 回答是正確的.
下面我粘貼一下 使用 使用游標帶參數的例子, 與 不使用的例巧梁子, 你可以對照一下.
-- 首先是一個 使用 帶參數的游標的例子, 也就是那個 游標(子表).
DECLARE
-- 定義游標(主表).
CURSOR c_test_main IS
SELECT id, value FROM test_main;
-- 保存主表游標數據的變數
v_main_data c_test_main%ROWTYPE;
-- 定義游標(子表).
CURSOR c_test_sub(p_main_id INT) IS
SELECT id, value
FROM test_sub
WHERE main_id = p_main_id;
-- 保存子表游標數據的變數
v_sub_data c_test_sub%ROWTYPE;
BEGIN
-- 打開游標(主表).
OPEN c_test_main;
-- 開始循環處理(主表).
LOOP
-- 填充數據(主表).
FETCH c_test_main INTO v_main_data;
-- 假如沒有檢索到(主表)數據,結束循環處理
Exit when c_test_main%NOTFOUND;
dbms_output.put_line('Main:'
|| TO_CHAR(v_main_data.id) || '哪神='
|| v_main_data.value );
-- 打開游標(子表).
OPEN c_test_sub(v_main_data.id);
-- 開始循環處理(子表).
LOOP
-- 填充數據(子表).
FETCH c_test_sub INTO v_sub_data;
-- 假如沒有檢索到(子表)數據,結束循環處理
Exit when c_test_sub%NOTFOUND;
dbms_output.put_line('-->Sub:'
|| TO_CHAR(v_sub_data.id) || '='
|| v_sub_data.value );
END LOOP;
-- 關閉游標(子表).
CLOSE c_test_sub;
END LOOP;
-- 關閉游標(主表).
CLOSE c_test_main;
END;
/
-- 下面是 SQL Server 的, 不支持 帶參數的游標 的
子游標的中的 SQL 語句裡面,寫入子表列名 = @變數的方式。
通過在父游標中更新該變數的方式來實現同樣的功能。
DECLARE
@id INT, @value VARCHAR(10),
@subid INT, @subvalue VARCHAR(10);
BEGIN
-- 定義游標(主表).
DECLARE c_test_main CURSORFOR
SELECT id,valueFROM test_main;
-- 注意:假如子表的游標定義在這里,執行的時候,將得不到結果
-- 打開游標(主表).
OPEN c_test_main;
WHILE 1=1
BEGIN
-- 填充數據.
FETCH NEXT FROM c_test_main INTO @id, @value;
-- 假如未檢索到(主表)數據,退出循環.
IF@@fetch_status!= 0 BREAK;
PRINT'Main:'+CAST(@id asvarchar)+'='+ @value;
-- 定義游孝緩運標(子表).
DECLARE c_test_sub CURSORFOR
SELECT id,value
FROM test_sub
WHERE main_id = @id;
-- 打開游標(子表).
OPEN c_test_sub;
WHILE 2=2
BEGIN
-- 填充數據.
FETCH NEXT FROM c_test_sub INTO @subid, @subvalue;
-- 假如未檢索到(子表)數據,退出循環.
IF@@fetch_status!= 0 BREAK;
PRINT'Sub:'+ @subvalue;
END;
-- 關閉游標(子表)
CLOSE c_test_sub;
-- 釋放游標(子表).
DEALLOCATE c_test_sub;
END;
-- 關閉游標(主表)
CLOSE c_test_main;
-- 釋放游標(主表).
DEALLOCATE c_test_main;
END;
go
G. oracle存儲過程中使用游標作為out類型參數,求救!
1、你定義的【RET_CURSOR_VALUE】是一個游標變數,當他作為參數傳入過程【GET_EMPINFOBYDEPNO】時候已經被打開(就是open...for),在主程序中再度打開是沒有必要的也是錯誤的(且游標變數只能用【open...for】的形式打開)。
2、所以把【OPEN
RET_CURSOR_VALUE】這句話刪掉,就沒有問題了。
*******************************
口說無憑,oracle實施log請參照:
說明:我把empno改成20了(因為表裡面沒有1的數據),還有把open語句注掉了。
*******************************
[SCOTT@ORA1]
SQL>DECLARE
2
RET_CURSOR_VALUE
PKG_CONST.REF_CURSOR;
3
RET_EMPNO
EMP.EMPNO%TYPE;
4
RET_ENAME
EMP.ENAME%TYPE;
5
BEGIN
6
GET_EMPINFOBYDEPNO(20,
RET_CURSOR_VALUE);
7
--OPEN
RET_CURSOR_VALUE
;--報游標類型有誤,未解決!!!
8
LOOP
9
FETCH
RET_CURSOR_VALUE
10
INTO
RET_EMPNO,
RET_ENAME;
11
EXIT
WHEN
RET_CURSOR_VALUE%NOTFOUND;
12
DBMS_OUTPUT.PUT_LINE('empNo
is:'
||
RET_EMPNO
||
',empName
is'
||
13
RET_ENAME);
14
END
LOOP;
15
CLOSE
RET_CURSOR_VALUE;
16
END;
17
/
empNo
is:7369,empName
isSMITH
empNo
is:7566,empName
isJONES
empNo
is:7902,empName
isFORD
---
以上,希望對你有所幫助。
H. java調用的存儲過程,能否傳入游標參數
java調用的存儲過程,不能傳入游標參數,但是存儲過程調用的內部存儲過程,可以存入游標參數。未完待續
I. 存儲過程使用游標
ALTER proc [dbo].[存儲過程名]
as
begin
declare 游標名字 cursor for select 列名 from 表名 where 條件--先申明游標指向查詢出瞎虧州的結果,一列,或者多列都可以,空仔條件自定
declare 變數名 varchar(400)--存儲取到的值
open 游標名 --開啟游標
while @@FETCH_STATUS=0--取值
begin
fetch next FROM 游標名 into 變數名--這樣就將游標指向下一行,得到的第一行值磨蔽就傳給變數了
-------------------------------------------
--需要執行的操作,例如修改某表中的欄位
update 表名
set 列名=值
where (修改表中的列)=變數名
-------------------------------------------
end
close 游標名--關閉游標
deallocate 游標名--釋放游標
end
請採納。
J. 關於存儲過程里使用游標和循環的問題
、帶參數游標for循環 一 首先編寫存儲程整體結構,: create or replace procere test_proc is v_date date; --變數定義 begin select sysdate into v_date from al; end test_proc; 二 定義游標: create or replace procere test_proc is v_date date; --定義變數 cursor cur is select * from ldcode; --定義游標 begin select sysdate into v_date from al; end test_proc; 三 編寫for循環: create or replace procere test_proc is v_date date; --定義變數 cursor cur is select * from ldcode where rownum<一0; --定義游標 begin select sysdate into v_date from al; --游標for循環始 for temp in cur loop --temp臨變數名,自任意起 Dbms_Output.put_line(temp.Code); --輸某欄位,使用"變數名.列名"即 end loop; --游標for循環結束 end test_proc; 四 測試運行點擊【DBMS Output】標簽頁查看結圖: END 二、帶參數游標for循環 一 定義帶參數游標: cursor cur(v_codetype ldcode.Codetype%TYPE) is select * from ldcode where codetype = v_codetype; --定義游標 定義游標格式: cursor 游標名稱(變數定義) is 查詢語句; 注意: where條件變數名v_codetype要與游標定義cur(v_codetype ldcode.Codetype%TYPE)致 二 編寫for循環部: --游標for循環始 for temp in cur('llmedfeetype') loop --temp臨變數名,自任意起 --cur('llmedfeetype')"游標名稱(傳入變數)" Dbms_Output.put_line(temp.Code); --輸某欄位,使用"變數名.列名"即 end loop; --游標for循環結束 三 測試運行點擊【DBMS Outpu