當前位置:首頁 » 存儲配置 » 存儲過程使用變數指針

存儲過程使用變數指針

發布時間: 2022-12-28 21:10:02

㈠ Perl 如何處理 返回多個游標的DB2存儲過程

一個游標(cursor)可以被看作指向結果集(a set of rows)中一行的指針(pointer)。游標每個時間點只能指向一行,但是可以根據需要指向結果集中其他的行。
例如:SELECT * FROM employees WHERE sex='M'會返回所有性別為男的雇員,在初始的時候,游標被放置在結果集中第一行的前面。使游標指向第一行,要執行FETCH。當游標指向結果集中一行的時候,可以對這行數據進行加工處理,要想得到下一行數據,要繼續執行FETCH。FETCH操作可以重復執行,直到完成結果集中的所有行

在存儲過程中使用游標,有如下幾個步驟:
聲明游標、打開游標、根據需要一次一行,講游標指向的數據取到本地變數(local variables)中、結束時關閉游標

聲明游標:
>>-DECLARE--cursor-name--CURSOR----+------------+--------->
'-WITH HOLD--'
>-----+--------------------------------+--------------------->
| .-TO CALLER--. |
'-WITH RETURN--+------------+--'
'-TO CLIENT--'
>----FOR--+-select-statement-+----------------------------><
'-statement-name---'
WITH RETURN子句用於將游標所定義的結果集傳遞給另一個存儲過程或者應用(an application)
如果select語句中包含CURRENT DATE, CURRENT TIME和CURRENT TIMESTAMP,所有的FETCH語句都會返回相同的日期、時間、時間戳值,因為這些特定寄存器是在打開游標(OPEN CURSOR)的時候進行檢查的

㈡ 修改sql Server2000中NTEXT的問題

text,ntext,image類型的欄位操作有點特殊
WRITETEXT
允許對現有的
text、ntext

image
列進行無日誌記錄的互動式更新。該語句將徹底重寫受其影響的列中的任何現有數據。WRITETEXT
語句不能用在視圖中的
text、ntext

image
列上。
UPDATETEXT
更新現有
text、ntext

image
欄位。使用
UPDATETEXT
在適當的位置更改
text、ntext

image
列的一部分。使用
WRITETEXT
來更新和替換整個
text、ntext

image
欄位。
你看看這個例子修改下你的存儲過程吧
示例
本示例把文本指針置於局部變數
@ptrval
中,然後使用
UPDATETEXT
更新拼寫錯誤。
USE
pubs
GO
EXEC
sp_dboption
'pubs',
'select
into/bulk',
'true'
GO
DECLARE
@ptrval
binary(16)
SELECT
@ptrval
=
TEXTPTR(pr_info)
FROM
pub_info
pr,
publishers
p
WHERE
p.pub_id
=
pr.pub_id
AND
p.pub_name
=
'New
Moon
Books'
UPDATETEXT
pub_info.pr_info
@ptrval
88
1
'b'
GO
EXEC
sp_dboption
'pubs',
'select
into/bulk',
'false'
GO
返回特定文本數據
下例在
pubs
資料庫
pub_info
表中查找與
pub_id
0736
相關聯的
text

(pr_info)。下例首先聲明一個局部變數
@val。然後將文本指針(長二進制字元串)置於
@val
中,並將其作為參數提供給
READTEXT
語句,該語句將返回從第五個位元組(偏移量為
4)開始的
10
個位元組。
USE
pubs
GO
DECLARE
@val
varbinary(16)
SELECT
@val
=
TEXTPTR(pr_info)
FROM
pub_info
WHERE
pub_id
=
'0736'
READTEXT
pub_info.pr_info
@val
4
10
GO

㈢ 如何用java調用存儲過程

已儲存過程儲存在資料庫中。對已儲存過程的調用是 CallableStatement對象所含的內容。這種調用是用一種換碼語法來寫的,有兩種形式:一種形式帶結果參,另一種形式不帶結果參數。結果參數是一種輸出 (OUT) 參數,是已儲存過程的返回值。兩種形式都可帶有數量可變的輸入(IN 參數)、輸出(OUT 參數)或輸入和輸出(INOUT 參數)的參數。問號將用作參數的佔位符。 在JDBC 中調用已儲存過程的語法如下所示。注意,方括弧表示其間的內容是可選項;方括弧本身並不是語法的組成部份。{call 過程名[(?, ?, ...)]} 返回結果參數的過程的語法為:{? = call 過程名[(?, ?, ...)]} 不帶參數的已儲存過程的語法類似:{call 過程名} 通常,創建 CallableStatement 對象的人應當知道所用的 DBMS 是支持已儲存過程的,並且知道這些過程都是些什麼。然而,如果需要檢查,多種DatabaseMetaData 方法都可以提供這樣的信息。例如,如果 DBMS 支持已儲存過程的調用,則supportsStoredProceres 方法將返回 true,而getProceres 方法將返回對已儲存過程的描述。CallableStatement 繼承 Statement 的方法(它們用於處理一般的 SQL 語句),還繼承了 PreparedStatement 的方法(它們用於處理 IN 參)。 CallableStatement 中定義的所有方法都用於處理 OUT 參數或 INOUT 參數的輸出部分:注冊 OUT 參數的 JDBC 類型(一般 SQL 類型)、從這些參數中檢索結果,或者檢查所返回的值是否為 JDBC NULL。 1、創建 CallableStatement 對象 CallableStatement 對象是用 Connection 方法 prepareCall 創建的。下例創建 CallableStatement 的實例,其中含有對已儲存過程 getTestData 調用。該過程有兩個變數,但不含結果參數:CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}"); 其中?佔位符為IN、OUT還是INOUT參數,取決於已儲存過程getTestData。 2、IN和OUT參數 將IN參數傳給 CallableStatement 對象是通過 setXXX 方法完成的。該方法繼承自 PreparedStatement。所傳入參數的類型決定了所用的setXXX方法(例如,用 setFloat 來傳入 float 值等)。 如果已儲存過程返回 OUT 參數,則在執行 CallableStatement 對象以前必須先注冊每個 OUT 參數的 JDBC 類型(這是必需的,因為某些 DBMS 要求 JDBC 類型)。注冊 JDBC 類型是用 registerOutParameter 方法來完成的。語句執行完後,CallableStatement 的 getXXX 方法將取回參數值。正確的 getXXX 方法是為各參數所注冊的 JDBC 類型所對應的 Java 類型。換言之, registerOutParameter 使用的是 JDBC 類型(因此它與資料庫返回的 JDBC 類型匹配),而 getXXX 將之轉換為 Java 類型。 作為示例,下述代碼先注冊 OUT 參數,執行由 cstmt 所調用的已儲存過程,然後檢索在 OUT 參數中返回的值。方法 getByte 從第一個 OUT 參數中取出一個 Java 位元組,而 getBigDecimal 從第二個 OUT 參數中取出一個 BigDecimal 對象(小數點後面帶三位數):CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
cstmt.executeQuery();
byte x = cstmt.getByte(1);
java.math.BigDecimal n = cstmt.getBigDecimal(2, 3); CallableStatement 與 ResultSet 不同,它不提供用增量方式檢索大 OUT 值的特殊機制。3、INOUT參數 既支持輸入又接受輸出的參數(INOUT 參數)除了調用 registerOutParameter 方法外,還要求調用適當的 setXXX 方法(該方法是從 PreparedStatement 繼承來的)。setXXX 方法將參數值設置為輸入參數,而 registerOutParameter 方法將它的 JDBC 類型注冊為輸出參數。setXXX 方法提供一個 Java 值,而驅動程序先把這個值轉換為 JDBC 值,然後將它送到資料庫中。這種 IN 值的 JDBC 類型和提供給 registerOutParameter 方法的 JDBC 類型應該相同。然後,要檢索輸出值,就要用對應的 getXXX 方法。例如,Java 類型為byte 的參數應該使用方法 setByte 來賦輸入值。應該給registerOutParameter 提供類型為 TINYINT 的 JDBC 類型,同時應使用 getByte 來檢索輸出值。 下例假設有一個已儲存過程 reviseTotal,其唯一參數是 INOUT 參數。方法setByte 把此參數設為 25,驅動程序將把它作為 JDBC TINYINT 類型送到資料庫中。接著,registerOutParameter 將該參數注冊為 JDBC TINYINT。執行完該已儲存過程後,將返回一個新的 JDBC TINYINT 值。方法 getByte 將把這個新值作為 Java byte 類型檢索。CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");
cstmt.setByte(1, 25);
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.executeUpdate();
byte x = cstmt.getByte(1); 4、先檢索結果,再檢索 OUT 參數 由於某些 DBMS 的限制,為了實現最大的可移植性,建議先檢索由執行CallableStatement 對象所產生的結果,然後再用 CallableStatement.getXXX 方法來檢索 OUT 參數。如果 CallableStatement 對象返回多個 ResultSet 對象(通過調用 execute 方法),在檢索 OUT 參數前應先檢索所有的結果。這種情況下,為確保對所有的結果都進行了訪問,必須對 Statement 方法 getResultSet、getUpdateCount 和getMoreResults 進行調用,直到不再有結果為止。 檢索完所有的結果後,就可用 CallableStatement.getXXX 方法來檢索 OUT 參數中的值。 5、檢索作為OUT參數的NULL值 返回到 OUT 參數中的值可能會是JDBC NULL。當出現這種情形時,將對 JDBC NULL 值進行轉換以使 getXXX 方法所返回的值為 null、0 或 false,這取決於getXXX 方法類型。對於 ResultSet 對象,要知道0或false是否源於JDBCNULL的唯一方法,是用方法wasNull進行檢測。如果 getXXX 方法讀取的最後一個值是 JDBC NULL,則該方法返回 true,否則返回 flase。
復雜的返回值 關於存儲過程的知識,很多人好像就熟悉我們所討論的這些。如果這是存儲過程的全部功能,那麼存儲過程就不是其它遠程執行機制的替換方案了。存儲過程的功能比這強大得多。
某些DBMS允許從存儲過程中返回遊標的一個引用。JDBC並不支持這個功能,但是Oracle、PostgreSQL和DB2的JDBC驅動器都支持在ResultSet上打開到游標的指針(pointer)。
設想列出所有沒有活到退休年齡的詩人,下面是完成這個功能的存儲過程,返回一個打開的游標,同樣也使用PostgreSQL的pl/pgsql語言: create procere list_early_deaths () return refcursor as 'declare toesup refcursor;begin open toesup for SELECT poets.name, deaths.age FROM poets, deaths -- all entries in deaths are for poets. -- but the table might become generic. WHERE poets.id = deaths.mort_id AND deaths.age < 60; return toesup;end;' language 'plpgsql'; 下面是調用該存儲過程的Java方法,將結果輸出到PrintWriter:
PrintWriter: static void sendEarlyDeaths(PrintWriter out){ Connection con = null; CallableStatement toesUp = null; try { con = ConnectionPool.getConnection(); // PostgreSQL needs a transaction to do this... con. setAutoCommit(false); // Setup the call. CallableStatement toesUp = connection.prepareCall("{ ? = call list_early_deaths () }"); toesUp.registerOutParameter(1, Types.OTHER); toesUp.execute(); ResultSet rs = (ResultSet) toesUp.getObject(1); while (rs.next()) { String name = rs.getString(1); int age = rs.getInt(2); out.println(name + " was " + age + " years old."); } rs.close(); } catch (SQLException e) { // We should protect these calls. toesUp.close(); con.close(); }} 因為JDBC並不直接支持從存儲過程中返回遊標,我們使用Types.OTHER來指示存儲過程的返回類型,然後調用getObject()方法並對返回值進行強制類型轉換。
這個調用存儲過程的Java方法是mapping的一個好例子。Mapping是對一個集上的操作進行抽象的方法。不是在這個過程上返回一個集,我們可以把操作傳送進去執行。本例中,操作就是把ResultSet列印到一個輸出流。這是一個值得舉例的很常用的例子,下面是調用同一個存儲過程的另外一個方法實現: public class ProcessPoetDeaths{ public abstract void sendDeath(String name, int age);} static void mapEarlyDeaths(ProcessPoetDeaths mapper){ Connection con = null; CallableStatement toesUp = null; try { con = ConnectionPool.getConnection(); con.setAutoCommit(false); CallableStatement toesUp = connection.prepareCall("{ ? = call list_early_deaths () }"); toesUp.registerOutParameter(1, Types.OTHER); toesUp.execute(); ResultSet rs = (ResultSet) toesUp.getObject(1); while (rs.next()) { String name = rs.getString(1); int age = rs.getInt(2); mapper.sendDeath(name, age); } rs.close(); } catch (SQLException e) { // We should protect these calls. toesUp.close(); con.close(); }} 這允許在ResultSet數據上執行任意的處理,而不需要改變或者復制獲取ResultSet的方法: static void sendEarlyDeaths(final PrintWriter out){ ProcessPoetDeaths myMapper = new ProcessPoetDeaths() { public void sendDeath(String name, int age) { out.println(name + " was " + age + " years old."); } }; mapEarlyDeaths(myMapper);} 這個方法使用ProcessPoetDeaths的一個匿名實例調用mapEarlyDeaths。該實例擁有sendDeath方法的一個實現,和我們上面的例子一樣的方式把結果寫入到輸出流。當然,這個技巧並不是存儲過程特有的,但是和存儲過程中返回的ResultSet結合使用,是一個非常強大的工具。 結論存儲過程可以幫助你在代碼中分離邏輯,這基本上總是有益的。這個分離的好處有:
快速創建應用,使用和應用一起改變和改善的資料庫模式。
資料庫模式可以在以後改變而不影響Java對象,當我們完成應用後,可以重新設計更好的模式。
存儲過程通過更好的SQL嵌入使得復雜的SQL更容易理解。
編寫存儲過程比在Java中編寫嵌入的SQL擁有更好的工具--大部分編輯器都提供語法高亮!
存儲過程可以在任何SQL命令行中測試,這使得調試更加容易。 並不是所有的資料庫都支持存儲過程,但是存在許多很棒的實現,包括免費/開源的和非免費的,所以移植並不是一個問題。Oracle、PostgreSQL和DB2都有類似的存儲過程語言,並且有在線的社區很好地支持。
存儲過程工具很多,有像TOAD或TORA這樣的編輯器、調試器和IDE,提供了編寫、維護PL/SQL或pl/pgsql的強大的環境。
存儲過程確實增加了你的代碼的開銷,但是它們和大多數的應用伺服器相比,開銷小得多。

㈣ oracle 存儲過程 如何把參數傳入到指針中

DECLARE

-- step 1: declare the variables
v_proct_id procts.proct_id%TYPE;
v_name procts.name%TYPE;
v_price procts.price%TYPE;

-- step 2: declare the cursor
CURSOR cv_proct_cursor IS
SELECT proct_id, name, price
FROM procts
ORDER BY proct_id;

BEGIN

-- step 3: open the cursor
OPEN cv_proct_cursor;

LOOP

-- step 4: fetch the rows from the cursor
FETCH cv_proct_cursor
INTO v_proct_id, v_name, v_price;

-- exit the loop when there are no more rows, as indicated by
-- the Boolean variable cv_proct_cursor%NOTFOUND (= true when
-- there are no more rows)
EXIT WHEN cv_proct_cursor%NOTFOUND;
-- use DBMS_OUTPUT.PUT_LINE() to display the variables
DBMS_OUTPUT.PUT_LINE(
'v_proct_id = ' || v_proct_id || ', v_name = ' || v_name ||
', v_price = ' || v_price
);

END LOOP;

-- step 5: close the cursor
CLOSE cv_proct_cursor;

END;
這個例子比較好

㈤ c++/java/c# 幾種編程語言的指針、引用比較

Java 引用可以賦值 null, 而 c++ 引用 (見 fun2) 不能賦值 null,c++ 指針可以賦值 null(fun3).Java 中,無 c++ 引用(fun2)對應的語法。 結果引起不必要的質疑,特此,寫博客,對c++/java/c# 幾種編程語言的指針、引用,進行比較,期望引起更多的人,對此有所關注。 從語法上看,三種開發語言中,C++ 的指針、引用,最為復雜,因此,下面的舉例,都從 C++ 代碼開始,然後與 java/c# 的語法進行比較。 1) C++ 簡單類型變數,有直接變數定義、指針定義、引用定義。int aa = 10;//c++ int &bb = aa;//c++int *cc = &aa;//c++上述三行代碼,最後三個變數指向同一個數據。相比較而言,java/c# 都只有變數定義,無引用定義、指針定義。 2) C++ 函數調用參數,簡單類型變數,有直接變數定義、指針定義、引用定義,後兩個,在函數內部改變數據,退出函數,能看到改變後的數據。void simple_by_val(int a, constint b){ a=15; //b=13; //error C2166: l-value specifies const object //a=NULL; //good //b=NULL; //error C2166: l-value specifies const object}void simple_by_ref(int &a, constint &b){ a=25; //b=23; //error C2166: l-value specifies const object //a=NULL; //good //b=NULL; //error C2166: l-value specifies const object}void simple_by_pointer(int *a, constint *b){ *a = 35; //*b = 33; //error C2166: l-value specifies const object a = NULL; //ok b = NULL; //ok}java 沒有這么多名堂,只有直接變數定義。C# 略為復雜一點,有引用,有 out 參數。staticvoid M(int a, refint b, outint c) { c = 13; }相比較而言,C# 的函數參數( refint b), 類似於C++的函數參數( int &a),都是調用函數前要賦初值,在函數內部改變數據,退出函數,能看到改變後的數據。而C# 的 (outint c),在 C++/Java 中,無對應的語法。這個可以調用函數前,不賦初值。在 C# 之前,也很少見到這種語法,只在一些資料庫的存儲過程、函數定義中,見過類似語法。估計是從資料庫編程語法中抄襲過來的語法。特別註明:C# 的引用,只是用在函數參數變數定義上,不能用在函數內部的局部變數中。C++ 中的引用,可以用在函數內部的局部變數中。 3) C++ 的類對象變數定義語法,較為復雜,可以定義在stack 上(不用 new),可以定義在 heap(用 new)。 CMyClass obj; //stack CMyClass *p2 = new CMyClass(); //heapjava/C# 中,沒有這么復雜,可以認為是上述兩種「綜合+簡化」了。 4) 在 java/C# 中,如下用法是錯誤的,會報空指針異常;但是在 C++ 里是合法的。 CMyClass obj; obj.run();在C++ 中,CMyClass obj;以上一行代碼已經調用了構造函數,完成了變數初始化。而在 java/C# 中,這一行代碼相當於: CMyClass obj = null; 5) C++ 中,stack 變數出了作用范圍,內存自動回收;heap 變數,需要手工 delete。 java/C# 中,變數是空閑時自動回收的(理論上的),不是變數出了作用范圍,就內存回收。 6) 以下代碼在 C++ 中是正確的,在 java/C# 是錯誤的。在 java/C# 語法中,沒有定義變數加 * 的。CMyClass *p1 = null;CMyClass *p2 = new CMyClass(); 7) 以下代碼,在java/C# 語法中,是正確的,在 C++ 是錯誤的。CMyClass p1 = null;CMyClass p2 = new CMyClass(); 8) 以下代碼,在 C++ 代碼中,會調用「拷貝構造函數」、"等於號重載函數"。這兩個函數,在 C++ 中,默認會由編譯器自動生成。 //C++ CMyClass obj; //調用構造函數 CMyClass obj2 = obj; //調用拷貝構造函數 obj2 = obj; //調用= 重載函數以上代碼,大致相當於 java/C# 中的 克隆"clone"。但更隱蔽、更復雜。//C# CMyClass obj = new CMyClass(); CMyClass obj2 = (CMyClass)obj.Clone();而在C# 中,Clone 函數並不會自動生成。在 Java 中,可以調用 super.clone() ---- Java 基類 Object 默認有一個 clone 函數。在C++ 中,默認會由編譯器自動生成「拷貝構造函數」、"等於號重載函數",這一點,很多時候會造成問題,要特別注意。在C++ 中,函數返回值不要用 CMyClass ,這會造成不必要地調用「拷貝構造函數」、"等於號重載函數";也不要返回引用 CMyClass&, 對函數內局部變數的引用,退出函數後無法繼續使用。而要返回指針 CMyClass *。這一點很多初學者不明白。但是C++ 的 std:string 除外。std:string 的「拷貝構造函數」、"等於號重載函數"經過優化,拷貝後的變數,與拷貝之前的變數,內部使用相同的 char[] 數組,只有當一個 string 變數改變時,才會把 char[] 數組復製成兩份。std:string 的「拷貝構造函數」 沒有性能上損失,又比 string 指針減少了內存泄露,因此,對 std:string ,使用時盡量用 對象變數、對象引用、對象拷貝構造,避免使用 std:string 指針。 9) C++ 引用語法,有一些是 Java/C# 程序員不知道的語法//C++CMyClass &a1; //錯誤,C++ 引用變數定義的時候就要初始化;//Java/C# 對象變數,沒有要求,變數定義的時候就要初始化CMyClass &a1 = NULL; //錯誤,C++ 引用變數不能賦值 nullCMyClass &a1 = new CMyClass(); //錯誤,C++ 引用變數不能賦值給一個 new 對象,這種情況,要用 C++ 指針。//以下C++ 代碼是正確的:CMyClass a;CMyClass &a1 = a;CMyClass *b =new CMyClass();CMyClass &b1 = *b; //這種寫法不常用。 10) Sun 自稱 java 中消滅了 C++ 中萬惡的指針,只有自己的對象變數都是引用。做個比較:C++ 引用不能賦值 null, 不能賦值 new XXX();C++ 指針可以賦值 null, 可以賦值 new XXX()。C++ 引用對象通常在 stack 中,而C++ 指針 new 出來的對象則在 heap 中。 java/C# 中的對象變數,可以賦值 null, 可以賦值 new XXX()。java/C# 中的對象變數在 heap 中。 因此,java/C# 中的對象變數,更像是 C++ 中的指針,而不是 C++ 中的引用。 11) C++ 中,指針變數是一個 long 型整數,可以亂指的:CMyClass *obj = (CMyClass *) 99; //compile/run good, should not use 如果我知道一個內存地址,就可以定義一個C++指針變數,指向這個內存地址。C++ 的「引用」沒有這個功能。C#/Java 的對象變數更沒有這個功能。「指針亂指」 是 C++ 指針功能強大、靈活的體現,也是最容易出問題的地方。估計是因為這個原因,所以C#/Java 都去掉了這個功能。所謂「萬惡的C++指針」,多半,也是指的是「指針亂指」。 12) C++ 有野指針,即已經刪除對象,但指針還是指向刪除對象,還可以繼續操作,但運行結果不保證正確。CMyClass *p = new CMyClass();...//給p 指向的內存賦值delete p;//這時p 仍然指向之前的內存地址,該內存地址數據,短時間並沒有被清空或者覆蓋,仍然可以讀/寫。這就是「野指針」。p->run(); //運行很可能不出錯,但很可能與實際期望的結果不一樣。//但此時指針 p 對應的內存,可能被下一個 new XXX() 代碼,用了這個內存,因此,理論上講,delete 之後的指針,不應再用來操作對象。p= NULL; //將指針指向「空」,可以避免「野指針」問題。p->run(); //這里會報運行時錯誤。也就是空指針異常。空指針異常在 java/c# 中都有。C++ 中,delete 與將變數賦值 null , 理應放在一起。其實,由於 delete 關鍵字,是由 C++ 標準定義的,標准中,完全可以要求, delete 一行代碼,執行之後,把指針變數變成 null(C++ 標准,很多都是規定編譯器做什麼,因此可以加這個規定)。這樣可以避免野指針問題。可惜,C++ 標准,在這方面沒有考慮周全。

㈥ 請問,我如果需要把一個游標的當前指針,作為傳入參數從一個存儲過程傳給另一存儲過程,要如何處理。最好

設置一個全局的指針,將游標地址賦給指針,就可以用指針當做參數多次傳遞了

㈦ C++指針、數組、引用、變數作函數參數的問題

1, 變數作為參數,這是單向值傳遞。即將數據傳給被調函數後,與調用函數就不相關了,必須通過函數值返回操作結果。
如有函數聲明:void swap(int a,int b); //功能是交換a,b值,但事實上對調用函數沒有影響,因為swap函數的局部變數a,b在該函數執行完釋放掉了,其值也就丟失了。
2. 指針、數組作為參數,這是地址傳遞,指針和數組可以看成是指向一個或一片連續空間的指針(區別是:一個為變數地址,一個常量地址),它們傳遞的是所指數據或數據區的地址,這使得函數直接操作的就是原數據區的數據。好處是可以直接通過函數改變調用函數中的多個數據。
如有函數聲明:void swap(int *a,int *b); 傳遞是指向所指空間的地址,執行後,直接交換了調用函數中的數據;
再如: void max(int a[],n),求數組a中的最大值。也是傳遞數組的地址,操作的是調用函數的數組元素。
3.引用作為參數,引用就是別名,其實也是地址傳遞,但它是常量地址

㈧ Sql server 存儲過程中怎麼將變數賦值

/*
Sql server 存儲過程中怎麼將變數賦值
*/

--SQL賦值語句
DECLARE @test1 INT
SELECT @test1 = 111
SET @test1 = 222

--SQL函數賦值,假定count()是自定義函數
DECLARE @test2 INT
SELECT @test2 = COUNT(*) FROM sys.sysobjects

--SQL存儲過程賦值,直接傳參處理(類似C語言中的指針嗎)
IF OBJECT_ID('sp_test') IS NOT NULL DROP PROCEDURE sp_test
GO
CREATE PROCEDURE sp_test(@test INT OUTPUT)
AS
BEGIN
SELECT @test = 999
END
GO

DECLARE @test3 INT
EXEC sp_test @test3 OUTPUT
SELECT @test3

DROP PROCEDURE sp_test
GO

㈨ 6、什麼是存儲過程什麼是游標,何時使用、何時不用游標

存儲過程是一組命名了的SQL語句集合,是為了完成特定功能匯集而成的。該集合編譯後存放在資料庫中,可根據實際情況重新編譯,可直接運行,也可遠程運行且存儲過程直接在伺服器端運行。

游標實際上是一種能從包括多條數據記錄的結果集(結果集是select查詢之後返回的所有行數據的集合)中每次提取一條記錄的機制充當指針的作用,遍歷結果中的所有行,但他一次只指向一行。

游標在循環處理欄位的時候使用

建議:盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫;使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效;與臨時表一樣,游標並不是不可使用。

㈩ mybatits調用存儲過程輸入參數為指針怎麼處理

DECLARE

--step1:declarethevariables
v_proct_idprocts.proct_id%TYPE;
v_nameprocts.name%TYPE;
v_priceprocts.price%TYPE;

--step2:declarethecursor
CURSORcv_proct_cursorIS
SELECTproct_id,name,price
FROMprocts
ORDERBYproct_id;

BEGIN

--step3:openthecursor
OPENcv_proct_cursor;

LOOP

--step4:fetchtherowsfromthecursor
FETCHcv_proct_cursor
INTOv_proct_id,v_name,v_price;

--,asindicatedby
--theBooleanvariablecv_proct_cursor%NOTFOUND(=truewhen
--therearenomorerows)
EXITWHENcv_proct_cursor%NOTFOUND;
--useDBMS_OUTPUT.PUT_LINE()todisplaythevariables
DBMS_OUTPUT.PUT_LINE(
'v_proct_id='||v_proct_id||',v_name='||v_name||
',v_price='||v_price
);

ENDLOOP;

--step5:closethecursor
CLOSEcv_proct_cursor;

END;
這個例子比較好

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:598
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:890
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:584
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:768
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:688
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1015
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:259
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:118
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:808
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:716