當前位置:首頁 » 存儲配置 » 存儲過程嵌套循環

存儲過程嵌套循環

發布時間: 2025-09-15 00:15:24

① oracle中存儲過程執行很長時間,用了三個游標。

不用看執行計劃都知道慢了,
for c1
for c2
for c3
這種沒有任何條件的三重循環的時間復雜度為C1記錄數*C2記錄數*C3記錄數,你得盡量減少循環次數,能用sql就不要用游標循環了

② oracle 存儲過程 begin end

Oracle存儲過程基礎知識
商業規則和業務邏輯可以通過程序存儲在Oracle中,這個程序就是存儲過程。
存儲過程是SQL, PL/SQL, java 語句的組合,它使你能將執行商業規則的代碼從你的應用程序中移動到資料庫。這樣的結果就是,代碼存儲一次但是能夠被多個程序使用。
要創建一個過程對象(proceral object),必須有 CREATE PROCEDURE 系統許可權。如果這個過程對象需要被其他的用戶schema 使用,那麼你必須有 CREATE ANY PROCEDURE 許可權。執行 procere 的時候,可能需要excute許可權。或者EXCUTE ANY PROCEDURE 許可權。如果單獨賦予許可權,如下例所示:
grant execute on MY_PROCEDURE to Jelly
調用一個存儲過程的例子:
execute MY_PROCEDURE( 'ONE PARAMETER');
存儲過程(PROCEDURE)和函數(FUNCTION)的區別。
function有返回值,並且可以直接在Query中引用function和或者使用function的返回值。
本質上沒有區別,都是 PL/SQL 程序,都可以有返回值。最根本的區別是: 存儲過程是命令, 而函數是表達式的一部分。比如:
select max(NAME) FROM
但是不能 exec max(NAME) 如果此時max是函數。
PACKAGE是function,procere,variables 和sql 語句的組合。package允許多個procere使用同一個變數和游標。

創建 procere的語法:

CREATE [ OR REPLACE ] PROCEDURE [ schema.]procere
[(argument [IN | OUT | IN OUT ] [NO COPY] datatype
[, argument [IN | OUT | IN OUT ] [NO COPY] datatype]...
)]
[ authid { current_user | definer }]
{ is | as } { pl/sql_subprogram_body |
language { java name 'String' | c [ name, name] library lib_name
}]
Sql 代碼:
CREATE PROCEDURE sam.credit (acc_no IN NUMBER, amount IN NUMBER) AS
BEGIN
UPDATE accounts
SET balance = balance + amount
WHERE account_id = acc_no;
END;
可以使用 create or replace procere 語句, 這個語句的用處在於,你之前賦予的excute許可權都將被保留。
IN, OUT, IN OUT用來修飾參數。
IN 表示這個變數必須被調用者賦值然後傳入到PROCEDURE進行處理。
OUT 表示PRCEDURE 通過這個變數將值傳回給調用者。
IN OUT 則是這兩種的組合。
authid代表兩種許可權:
定義者許可權(difiner right 默認),執行者許可權(invoker right)。
定義者許可權說明這個procere中涉及的表,視圖等對象所需要的許可權只要定義者擁有許可權的話就可以訪問
執行者許可權則需要調用這個 procere的用戶擁有相關表和對象的許可權。

Oracle存儲過程的基本語法
1. 基本結構
CREATE OR REPLACE PROCEDURE 存儲過程名字
(
參數1 IN NUMBER,
參數2 IN NUMBER
) AS
變數1 INTEGER :=0;
變數2 DATE;
BEGIN
END 存儲過程名字
2. SELECT INTO STATEMENT
將select查詢的結果存入到變數中,可以同時將多個列存儲多個變數中,必須有一條
記錄,否則拋出異常(如果沒有記錄拋出NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 變數1,變數2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
...

3. IF 判斷
IF V_TEST=1 THEN
BEGIN
do something
END;
END IF;
4. while 循環
WHILE V_TEST=1 LOOP
BEGIN
XXXX
END;
END LOOP;
5. 變數賦值
V_TEST := 123;
6. 用for in 使用cursor
...
IS
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名1+cur_result.列名2
END;
END LOOP;
END;
7. 帶參數的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
OPEN C_USER(變數值);
LOOP
FETCH C_USER INTO V_NAME;
EXIT FETCH C_USER%NOTFOUND;
do something
END LOOP;
CLOSE C_USER;
8. 用pl/sql developer debug
連接資料庫後建立一個Test WINDOW
在窗口輸入調用SP的代碼,F9開始debug,CTRL+N單步調試

9. Pl/Sql中執行存儲過程
在sql*plus中:
declare
--必要的變數聲明,視你的過程而定
begin
execute yourprocure(parameter1,parameter2,...);
end
/
在SQL/PLUS中調用存儲過程,顯示結果:
SQL>set serveoutput on --打開輸出
SQL>var info1 number; --輸出1
SQL>var info2 number; --輸出2
SQL>declare
var1 varchar2(20); --輸入1
var2 varchar2(20); --輸入2
var3 varchar2(20); --輸入2
BEGIN
pro(var1,var2,var3,:info1,:info2);
END;
/
SQL>print info1;
SQL>print info2;
註:在EXECUTE IMMEDIATE STR語句是SQLPLUS中動態執行語句,它在執行中會自動提交,類似於DP中FORMS_DDL語句,在此語句中str是不能換行的,只能通過連接字元"||",或著在在換行時加上"-"連接字元。

③ 在sqlserver的存儲過程中怎樣使用if-else if

跟程序中使用差不多,if,else if,else,只不過在sqlserver中,{}使用begin和end代替,裡面嵌套什麼的,都跟程序中寫的差不多,簡單實例如下: declare @a intset @a=1if @a<0begin select '小於0'endelse if @a=0begin select '等於0'endelsebegin if @a>0 and @a<1 begin select '大於0小於1' end else begin select '大於1' endend在簡單看看程序代碼:int a=1;if(a<0){ 輸出小於0;}else if(a==0){ 輸出等於0;}else{ if(a>0&&a<1) { 輸出大於0小於1; } else { 輸出大於1 }}

熱點內容
可壓縮照片 發布:2025-09-15 02:07:38 瀏覽:302
本田xrv什麼配置有天窗有鑰匙打火 發布:2025-09-15 02:02:43 瀏覽:529
我的世界中伺服器防熊的指令 發布:2025-09-15 01:42:13 瀏覽:790
怎麼清鈴聲多多緩存音樂 發布:2025-09-15 01:35:44 瀏覽:689
java對excel的導入 發布:2025-09-15 01:27:42 瀏覽:603
目前安卓陣營哪個系統最穩定 發布:2025-09-15 00:57:32 瀏覽:268
phpredis工具 發布:2025-09-15 00:40:27 瀏覽:454
如何查詢水星路由器撥號密碼 發布:2025-09-15 00:21:06 瀏覽:310
存儲過程嵌套循環 發布:2025-09-15 00:15:24 瀏覽:668
什麼手游腳本好用 發布:2025-09-14 23:18:08 瀏覽:651