存儲過程中的is
⑴ 請問oracle存儲過程在is後面聲明的變數和begin語句塊裡面通過declare聲明的有何區別啊,謝謝
范圍上的區別,就像在方法外聲明的變數可以用在多個方法內使用,而方法內聲明的變數只能在該方法內使用。
⑵ oracle 存儲過程 as 和is 區別
第一個問題:is和as是可以互用的,用哪個都沒關系的
第二個問題:在外面
第三個問題:過程中沒有declare關鍵字,declare用在語句塊中
第四個問題:估計你看到的是做游標定義的東東,抑或者直接就一句sql。
⑶ 請問這句sql存儲過程的語句什麼is
1.存儲過程編譯器事先對存儲過程金星了語法檢查處理,避免了因sql語句語法不正確引起運行時出現異常的問題.
2.只在保存存儲過程時資料庫伺服器才進行編譯,以後每次執行存儲過程都不需要再進行重新編譯而一般的sql語句每執行一次就需要資料庫引擎重新編譯一次,所以使用存儲過程可以提高資料庫執行效率(補充:這點很有用,特別是感覺你的程序和資料庫相關有點慢時可以用這點,幫你程序運行的更快)
3.可以在定義存儲過程的時候直接檢查運行的結果是否正確,可視化的設計界面提高了效率.
4.避免了查詢字元串中包含單引號等特殊字元可能會出現的問題
5.一個項目中可能會多處用到相同的sql語句,使用存儲過程便於重用
6.修改靈活方便,當需要修改完成的功能時,只需要修改定義的存儲過程即可,不必單獨修改每一個引用.
⑷ oracle中的存儲過程怎麼寫
Oracle存儲過程寫法實例
總結項目中寫的存儲過程例子:
Oracle存儲過程基本語法 存儲過程
1 CREATE OR REPLACE PROCEDURE 存儲過程名
2 IS/AS
3 BEGIN
4 NULL;
5 EXCEIPTION;
6 END;
1、創建存儲過程,後面可用is或者as:
create or replace procere PRO_COMPLAIN_TEMPLATE as
2、定義變數,此處用到了%TYPE和%ROWTYPE,參考 /database/201211/168564.html ,另外定義了一個游標,TEM_INSTANCE TEMPLATE_CUR%ROWTYPE這個類型定義必須要在游標定義之後:
NEED_DO_FOR_ZL INTEGER;
CURRENT_MAX_ID MEMO_TEMPLET.TEMPLET_ID%TYPE;
CURSOR TEMPLATE_CUR IS SELECT TEMPLET_NAME, TEMPLET_CONTENT FROM SYS_COMPLAINT_TEMPLET;
TEM_INSTANCE TEMPLATE_CUR%ROWTYPE;
3、begin開始塊:
begin
4、該插入語句使用了DBLINK,還有使用DBMS_OUTPUT.put_line('列印信息')進行信息輸出:
insert into MEMO_TEMPLET (TEMPLET_ID, TEMPLET_CONTENT, TEMPLET_TYPE, TEMPLET_MEMO) (SELECT * FROM MEMO_TEMPLET@COMPANY);
SELECT COUNT(*) INTO NEED_DO_FOR_ZL FROM SYS_COMPLAINT_TEMPLET;
IF(NEED_DO_FOR_ZL > 0) THEN
DBMS_OUTPUT.put_line('列印信息');
SELECT MAX(TEMPLET_ID)+1 INTO CURRENT_MAX_ID FROM MEMO_TEMPLET;
DBMS_OUTPUT.put_line('MEMO_TEMPLET最大ID' || CURRENT_MAX_ID);
FOR TEM_INSTANCE IN TEMPLATE_CUR LOOP
INSERT INTO MEMO_TEMPLET (TEMPLET_ID, TEMPLET_CONTENT,
TEMPLET_TYPE, TEMPLET_MEMO) VALUES (CURRENT_MAX_ID,
TEM_INSTANCE.TEMPLET_CONTENT, '7', NULL);
CURRENT_MAX_ID := CURRENT_MAX_ID + 1;
DBMS_OUTPUT.put_line(TEM_INSTANCE.TEMPLET_CONTENT);
END LOOP;
END IF;
COMMIT;
www.2cto.com
4、exception塊,使用WHEN OTHERS THEN,其中用raise可顯示錯誤信息:
exception
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode);
raise;
ROLLBACK;
IF TEMPLATE_CUR%ISOPEN THEN
CLOSE TEMPLATE_CUR;
END IF;
DBMS_OUTPUT.put_line('列印信息');
end;
註:關於游標的使用,如果像本例中使用for循環去遍歷游標的話則不需要顯式的去用open/close
cursor打開和關閉游標,此處會自己處理,如果使用fetch
into的話就需要顯式開關游標,另外任意執行一個update操作,用隱式游標sql的屬性%found,%notfound,%rowcount,%isopen觀察update語句的執行情況,也可以使用來判斷游標狀態,如IF
TEMPLATE_CUR%ISOPEN THEN。