oracle存儲過程練習
1. oracle 存儲過程 求大神們幫幫忙
正文部分:
CREATE PROCEDURE sp_exec_35to41
@database varchar(60),@bzvarchar(5)
---創建存儲過程 帶2個參數
AS
begin
declare
@sqlstring varchar(2000)
--- 定義變數@sqlstring
alter table Acct_t_AcctItem disabletrigger all
---修改表 Acct_t_AcctItem 停止所有觸發器
delete from Acct_t_AcctItem
---刪除表 Acct_t_AcctItem 內容
set @sqlstring = 'insert into Acct_t_AcctItem SELECT AcctCode,AcctName,BalanceDir,Memoric,AuxDept,AuxEnterprise,AuxPerson,
AuxProject,EndFlag,AcctTypeID,Status,Breviary,TaxTypeID,AcctLvlID,SuperID,null,EndFlag,EndFlag,EndFlag,EndFlag
from ' + @database + '.dbo.Acct_t_AcctItem '
---設置欄位@sqlstring的內容,內容是從定義的資料庫:變數@database的表dbo.Acct_t_AcctItem復制列AcctCode,AcctName,BalanceDir,Memoric,AuxDept,AuxEnterprise,AuxPerson,
AuxProject,EndFlag,AcctTypeID,Status,Breviary,TaxTypeID,AcctLvlID,SuperID,null,EndFlag,EndFlag,EndFlag,EndFlag到表Acct_t_AcctItem
exec(@sqlstring)
---執行語句
alter table Acct_t_AcctItem enabletrigger all
---修改表 Acct_t_AcctItem 啟動所有觸發器
return
end
---這個存儲過程的意思是把表Acct_t_AcctItem內容清除,再從指定資料庫的表Acct_t_AcctItem復制內容到Acct_t_AcctItem,資料庫名稱由執行存儲過程的時候指定,sp_exec_35to41@database varchar(60)---資料庫名稱,@bzvarchar(5)---沒有用
2. ORACLE 存儲過程問題
使用包返回存儲過程結果集,例子:
create or replace package pkg_return_table
is
type c1 is ref
cursor;
procere p_return_table(v_c1 out c1); --定義存儲過程返回一個結果集
function f_return_table return pkg_return_table.c1; --定義函數返回一個結果集
procere
p_return_table1(v_id int,v_c1 out c1,v_c2 out c1);
--定義存儲過程返回多個結果集
end;
/
create or replace package body pkg_return_table
is
procere
p_return_table(v_c1 out c1)
is
begin
open v_c1 for select * from
student;
end p_return_table;
function f_return_table return
pkg_return_table.c1
is
v_c1 pkg_return_table.c1;
begin
open v_c1 for select * from student;
return v_c1;
end
f_return_table;
procere p_return_table1(v_id int,v_c1 out c1,v_c2 out
c1)
is
sqlstr varchar2(500);
begin
sqlstr:='select * from
student';
open v_c1 for sqlstr; --使用動態sql
sqlstr:='select * from
student where id=:w_id';
open v_c2 for sqlstr using v_id; --動態sql傳參
end p_return_table1;
end pkg_return_table;
/
--存儲過程調用
variable v_c1 REFCURSOR;
exec
pkg_return_table.p_return_table(:v_c1);
print v_c1;
--存儲過程調用
variable v_c1 REFCURSOR;
variable
v_c2 REFCURSOR;
exec
pkg_return_table.p_return_table1(1,:v_c1,:v_c2);
print v_c1;
print
v_c2;
--函數調用
select pkg_return_table.f_return_table()
from al;
重點是定義游標變數,獲取存儲過程結果集,然後Open游標,就跟平常的游標一樣的操作啦
不用包應該也可以的,定義REFCURSOR變數即可
希望能解決您的問題。
3. ORACLE的存儲過程問題
在網上搜了某帥哥的解決方案,希望對你有用!你的這個錯誤,我也沒遇到過,也學習下!
ORA-29282 UTL_FILE不能用,File handle does not exist.可如下操作:
1.創建directory(電腦相應的路徑一定要存在,並且注意要用大寫來創建,它會區分大小寫)
如:create directory utl_file_dir as 'd:\temp\utl_file';
2.授予許可權
如:grant read,write on directory utl_file_dir to 用戶;
3.可查看是否生成:
如: select * from all_directories;
4.如對所設的directory不滿意,可對其進行取消,
如: drop directory utl_file_dir;
4. Oracle 定義存儲過程 不能執行,處於無效狀態。
無效狀態有兩種可能,一種是你的存儲過程編輯沒有成功,創建了,但裡面有語法錯誤。
還有一種是存儲過程使用的表有結構上的改變,需要重新編譯一下。
你重新編譯一下,如果不成功,就是有語法問題,你需要修改存儲過程。
5. 如何oracle調試存儲過程
1.打開PL/SQL Developer 如果在機器上安裝了PL/SQL Developer的話,打開PL/SQL Developer界面 輸入用戶名,密碼和host名字,這個跟在程序中web.config中配置的完全相同,點擊確定 找到需要調試的存儲過程所在的包(Package bodies),如PACK_ACTIVITY,點擊右鍵,在彈出菜單中選擇[查看],得到包中的所有存儲過程和他們的代碼. 2.添加debug信息 為了能夠單步跟蹤存儲過程,需要為其所在的包添加debug信息,右鍵點擊需要調試的包,在彈出菜單中選中[添加調試信息]. 這樣就為包體添加了調試信息。 3.調試存儲過程 現在所有的准備工作都做好了,可以調試跟蹤存儲過程了。 選擇需要調試的存儲過程,點擊右鍵,在彈出菜單中選擇[測試],進去測試窗口. 測試窗口中有為了測試該存儲過程自動所產生的代碼,當然你也可以自己另外加入和修改代碼,對於我們目前只是為了調試存儲過程,自動生成的代碼已經足夠了。接著按照如下的步驟進行調試。 (1)添加存儲過程所需要的參數,我們項目中的大多數存儲過程都是需要參數的,參數可以在測試窗口右下部分輸入。 如:GetPanNO_New需要一個輸入參數v_employeeid,我們輸入180,輸出參數是mycursor,是查看結果的,不需要輸入任何值。 (2)開始調試,點擊[調試]菜單-[開始](或者按F9),就進去調試模式了,程序開始停在begin這一行. (3)以後的調試過程跟我們熟悉的的調試過程就一樣了: 運行(Ctrl+R) 單步進入(Ctrl+N) 單步跳過(Ctrl+O) 單步退出(Ctrl+T) 或者點擊debug工具條上的按扭: 當按Ctrl+N進去存儲過程的源代碼中後 在這個窗口中可以查看過程中的變數值和堆棧。 (4)調試運行完了後,可以查看結果如下(點擊mycursor變數旁邊的按鈕).
6. Oracle資料庫的存儲過程怎麼寫
1 CREATE OR REPLACE PROCEDURE 存儲過程名
2 IS
3 BEGIN
4 NULL;
5 END;
行1:
CREATE OR REPLACE PROCEDURE 是一個SQL語句通知Oracle資料庫去創建一個叫做skeleton存儲過程, 如果存在就覆蓋它;
行2:
IS關鍵詞表明後面將跟隨一個PL/SQL體。
行3:
BEGIN關鍵詞表明PL/SQL體的開始。
行4:
NULL PL/SQL語句表明什麼事都不做,這句不能刪去,因為PL/SQL體中至少需要有一句;
行5:
END關鍵詞表明PL/SQL體的結束.
存儲過程創建語法:
create or replace procere 存儲過程名(param1 in type,param2 out type)
as
變數1 類型(值范圍); --vs_msgVARCHAR2(4000);
變數2 類型(值范圍);
Begin
Select count(*) into 變數1 from 表A where列名=param1;
If (判斷條件) then
Select 列名 into 變數2 from 表A where列名=param1;
Dbms_output。Put_line(『列印信息』);
Elsif (判斷條件) then
Dbms_output。Put_line(『列印信息』);
Else
Raise 異常名(NO_DATA_FOUND);
End if;
Exception
When others then
Rollback;
End;
7. oracle存儲過程如何輸出信息
可用DBMS_OUTPUT.PUT_LINE()對存儲過程的進行輸出。
編寫存儲過程:
create or replace procere test_pro(in_num number)
as
M number;
begin
M := in_num;
if 0 < M then
dbms_output.put_line('輸出SQL語句1');
elsif M < 3 then
dbms_output.put_line('輸出SQL語句2');
else
dbms_output.put_line('nothing');
end if;
end;
(7)oracle存儲過程練習擴展閱讀;
存儲在資料庫的數據字典中,存儲在當前的應用中安全性由資料庫提供安全保證,必須通過授權才能使用存儲子程序,安全性靠應用程序來保證,如果能執行應用程序,就能執行該子程序。模式描述IN參數用來從調用環境中向存儲過程傳遞值,不能給IN參數賦值,給此參數傳遞的值可以是常量、有值的變數、表達式等。
8. Oracle 的存儲過程怎麼寫。
oracle 存儲過程的基本語法
1.基本結構
CREATE OR REPLACE PROCEDURE 存儲過程名字
(
參數1 IN NUMBER,
參數2 IN NUMBER
) IS
變數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. 用 Oracle 存儲過程編寫一個簡單的程序,要求
Oracle存儲過程開發的要點是:
• 使用Notepad文本編輯器,用Oracle PL/SQL編程語言寫一個存儲過程;
• 在Oracle資料庫中創建一個存儲過程;
• 在Oracle資料庫中使用SQL*Plus工具運行存儲過程;
• 在Oracle資料庫中修改存儲過程;
• 通過編譯錯誤調試存儲過程;
• 刪除存儲過程;
二.環境配置
包括以下內容:
• 一個文本編輯器Notepad;
• Oracle SQL*Plus工具,提交Oracle SQL和PL/SQL 語句到Oracle database。
• Oracle 10g express資料庫,它是免費使用的版本;